具有一对一关系的 EFCore BulkInsert

DKa*_*Kar 4 .net c# sql-server entity-framework-core asp.net-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; }
}
Run Code Online (Sandbox Code Playgroud)

然后我插入一个 Entity1 项目列表

 _context.BulkInsert(Entity1ItemsList);
Run Code Online (Sandbox Code Playgroud)

这仅适用并在我的数据库中插入 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");
Run Code Online (Sandbox Code Playgroud)

DKa*_*Kar 5

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

var bulkConfig = new BulkConfig()
{
    SetOutputIdentity = true,
    PreserveInsertOrder = true
};
Run Code Online (Sandbox Code Playgroud)

运行初始的 bulkconfig 以插入 Entities1List 并从 SQL Server 获取唯一 ID

_context.BulkInsert(Entity1ItemsList, bulkConfig);
Run Code Online (Sandbox Code Playgroud)

现在分配了唯一的主键,以便将它们的值设置为它们的相关实体使用

foreach (var item in Entity1ItemsList)
{
    item.Entity2Obj.Entity1_ID = item.ID;
}
Run Code Online (Sandbox Code Playgroud)

这将设置正确的外键值。然后我批量插入 Entities2List

var Entities2List = Entity1ItemsList.Select(u => u.Entity2Obj).ToList();
 _context.BulkInsert(Entities2List);
Run Code Online (Sandbox Code Playgroud)

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