c# - 具有一对一关系的 EF Core 批量插入

标签 c# .net sql-server asp.net-core entity-framework-core

我正在尝试在 .NET Core 2.1 中使用来自 EFCore.BulkExtensions 的批量插入,并具有一对一的关系。我有 2 个数据库实体

public partial class Entity1
{
    public int ID { get; set; }
    public virtual Entity2 Entity2Obj { get; set; }
}

public partial class Entity2 
{
    public int ID { get; set; }
    public int Entity1_ID{ get; set; }
    public virtual Entity1 Entity1Obj { get; set; }
}

然后我插入一个 Entity1 项目列表
 _context.BulkInsert(Entity1ItemsList);

这仅适用并在我的数据库中插入 Entity1 对象。不插入关联的 Entity2 项目。有没有办法实现这一目标?

导航属性在 Scaffold-DbContext 期间自动创建(数据库优先)
entity.HasOne(d => d.Entity1 )
    .WithOne(p => p.Entity2)
    .HasForeignKey<Entity2>(d => d.Entity1_ID)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("FK_Entity1_Entity2");

最佳答案

四处搜索后,我想我找到了解决方案。首先设置以下配置

var bulkConfig = new BulkConfig()
{
    SetOutputIdentity = true,
    PreserveInsertOrder = true
};

运行初始 bulkconfig 以插入 Entities1List 并从 SQL Server 获取唯一 ID
_context.BulkInsert(Entity1ItemsList, bulkConfig);

现在分配了唯一的主键,以便将它们的值设置为它们的相关实体使用
foreach (var item in Entity1ItemsList)
{
    item.Entity2Obj.Entity1_ID = item.ID;
}

这将设置正确的外键值。然后我批量插入 Entities2List
var Entities2List = Entity1ItemsList.Select(u => u.Entity2Obj).ToList();
 _context.BulkInsert(Entities2List);

我希望通过只使用一个 BulkInsert 来做一些更简单的事情,它会自动添加所有导航属性而不是 2。但这行得通,而且速度很快。

关于c# - 具有一对一关系的 EF Core 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398094/

相关文章:

c# - ServiceStack 3.9.71 中缺少类型

C# 数字格式 : leading plus sign AND spaces

c# - 每次在调用任何其他方法之前调用一个方法

c# - 在 .NET 4.5.2 控制台应用程序中使用 .NET Core 库

.net - 为什么.NET 中没有 IArray(T) 接口(interface)?

对部分列数据进行 SQL 联接 (SQL Server)

c# - Entity Framework 从表达式生成错误的参数类型

c# - .NET HTTP GET 与正文

c# - 从服务(本地系统帐户)运行 msiexec

sql - 根据日期删除一对值中的一个