Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
C# 使用实体框架保存大型实体和子实体_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 使用实体框架保存大型实体和子实体

C# 使用实体框架保存大型实体和子实体,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我需要更新一个实体,它有两个孩子,这两个孩子都依赖于父母 Job(PK: Jobid) Holes(PK: Holeid, FK: Jobid) / Orders(PK: Orderid, FK: Jobid) Tools(PK: Toolid, FK: Holeid, FK: Orderid) / ToolHoles(PK: Holeid, Orderid) Tools还有7个子项继承自它 保存时该作业将已存在。作业可能包

我需要更新一个实体,它有两个孩子,这两个孩子都依赖于父母

                            Job(PK: Jobid)
       Holes(PK: Holeid, FK: Jobid) / Orders(PK: Orderid, FK: Jobid)
Tools(PK: Toolid, FK: Holeid, FK: Orderid) / ToolHoles(PK: Holeid, Orderid)
Tools还有7个子项继承自它

保存时该作业将已存在。作业可能包含,也可能尚未包含每个子实体的一个或多个

我需要能够在一个事务中保存所有这些信息,以便不将部分信息保存到数据库中


我当前的尝试是使用所有相关信息构建作业实体,并调用SaveChanges。如果要添加新实体,则必须在保存时为除Jobid之外的所有实体生成键。我试图实现的目标可能实现吗?

在这里做一些假设,如果我偏离了基准,请告诉我。如果您的场景如下所示,那么您应该很好

var myHoles = new Holes();
var myOrders = new Orders();
var myTools = new Tools();
var myToolHoles = new ToolHoles();

myJob.Holes.Add(myHoles);  //myJob already exists
myJob.Orders.Add(myOrders);

myHoles.Tools.Add(myTools);
myOrders.Tools.Add(myTools);

myHoles.ToolHoles.Add(myToolHoles);
myOrders.ToolHoles.Add(myToolHoles);

db.SaveChanges();
你说的是“一笔交易”,但实际情况是发生了几笔交易

  • myHoles
    myorder
    将被插入到数据库中,并适当设置它们的
    JobId
  • EF将了解他们的ID是什么
  • myTools
    myToolHoles
    将与
    HoleId
    OrderId
    一起插入,并使用第二步中找到的值进行设置

如果您问“EF是否跟踪新密钥并适当地更新子密钥”,那么答案是“是”,即使子密钥将从父母双方获得新密钥?当然,您也可以使用
将代码包装在
中,并使用
BeginTransaction()
提交()
回滚()
。所以我需要将工具/工具孔映射到孔和订单?我以前也尝试过,但在检测到冲突更改时出错。它们现在是如何关联的?我发现我没有正确映射到孔。我添加它们的方式与添加订单的方式相同,这是不正确的。谢谢你的帮助。希望我能利用这些知识让它工作。