我正在尝试在 .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/