Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在执行entityframework.bulkinsert时插入父子级?_Entity Framework_Entity Framework 4_Entity Framework 5_Entity_Entity Framework 6 - Fatal编程技术网

Entity framework 如何在执行entityframework.bulkinsert时插入父子级?

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;

我正在使用Entityframework 6,我正在尝试在数据库中插入父子类型的数据。 我正在使用Entityframework.BulkInsert插入数据。我在所有表中都有自动递增int主键

我的目标如下:

    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
    类型
  • 使用以下(主要是伪代码)序列保存整个结构

  • 注:此项未经测试

    这很难看,但它应该做到:尽量减少到SQL Server的往返,并且仍然是一个事务

    为了使
    选择
    更快,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);