Entity framework 如何在执行entityframework.bulkinsert时插入父子级?
我正在使用Entityframework 6,我正在尝试在数据库中插入父子类型的数据。 我正在使用Entityframework.BulkInsert插入数据。我在所有表中都有自动递增int主键 我的目标如下:Entity framework 如何在执行entityframework.bulkinsert时插入父子级?,entity-framework,entity-framework-4,entity-framework-5,entity,entity-framework-6,Entity Framework,Entity Framework 4,Entity Framework 5,Entity,Entity Framework 6,我正在使用Entityframework 6,我正在尝试在数据库中插入父子类型的数据。 我正在使用Entityframework.BulkInsert插入数据。我在所有表中都有自动递增int主键 我的目标如下: var parentObjects= new List<parentObject>(); var childObjects= new List<childObject>(); for (int i = 0;
var parentObjects= new List<parentObject>();
var childObjects= new List<childObject>();
for (int i = 0; i <= 100; i++)
{
var parentObj= new parentObject()
{
Name="p1",
Address="a1"
};
childObjects= SeedInitializer.ChildItems.OrderBy(x => new Random().Next()).Take(2).ToList();//this gets 2 child objects
foreach (var childObj in childObjects)
{
childObj .ParentObject= parentObj;
//childObj .CommissionPlanId = i; //tried this still not working
parentObj.ChildObjects.Add(childObj );
}
parentObjects.Add(parentObj);
}
//when I do a quickwatch on parentObjects, i see child objects in each parentObject, but
//with the last id of parentObject
context.BulkInsert(parentObjects, 1000);
context.SaveChanges();
var parentObjects=new List();
var childObjects=新列表();
for(int i=0;i new Random().Next()).Take(2.ToList()//这将获得2个子对象
foreach(childObjects中的var childObj)
{
childObj.ParentObject=parentObj;
//childObj.CommissionPlanId=i;//尝试了此操作,但仍不起作用
parentObj.ChildObjects.Add(childObj);
}
parentObjects.Add(parentObj);
}
//在parentObject上执行快速监视时,我会在每个parentObject中看到子对象,但
//使用parentObject的最后一个id
BulkInsert(parentObjects,1000);
SaveChanges();
保存时,仅在childObject中创建2条记录,这些记录是使用错误的parentObject id(即0)创建的
我无法理解为什么在创建父对象时没有创建子项。有人能帮我理解我在哪里犯了错误吗?我认为没有一个简单的方法来完成这项任务,因为为了插入孩子,你必须实际完成插入家长并获取他们的ID。普通EF插入的优点是,每个
INSERT
还将嵌入一个SELECT
,以获取刚刚生成的标识符,这样它就可以用于为子项(如果有)推送它
一种可能的解决方案如下:
Guid RefProperty
添加到也被持久化的ParentObject
类型Guid BatchId
添加到也被持久化的ParentObject
类型中Guid RefProperty
添加到未持久化的ChildObject
类型选择
更快,ParentObject表上的索引应该放在BatchId
上,包括(覆盖)其键
备选方案:将这些表的设计更改为不使用自动增量,而是使用
UNIQUEIDENTIFIER
列。这样,可以在插入之前设置所有标识符。免责声明:我是
你不能
此功能从未实现过
免责声明:我是 但是,这个新库(不是免费的)可以轻松处理这种情况 BulkSaveChanges的工作原理与SaveChanges(处理父/子)完全相同,但速度更快 支持所有方法:
- 批量保存更改
- 批量插入
- 批量删除
- 批量更新
- 批量合并
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
试图做类似的事情,却没有运气。然后我读到了。。
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);