2014-11-20 58 views
1

我需要更新一个实体,该实体有两个孩子,这两个孩子也有两个孩子,这两个孩子都依赖父母。保存大型实体和子实体框架

      Job(PK: Jobid) 
     Holes(PK: Holeid, FK: Jobid)/Orders(PK: Orderid, FK: Jobid) 
Tools(PK: Toolid, FK: Holeid, FK: Orderid)/ToolHoles(PK: Holeid, Orderid) 

工具还有7个孩子从它继承。

作业在保存时已经存在。这项工作可能已经或可能不会包含每个子实体的一个或多个。

我需要能够保存所有这些信息在一个事务中,使部分信息没有保存到数据库中。

我目前的尝试已经建立起来的工作实体的所有相关信息和呼叫的SaveChanges。如果我添加新实体,则除了Jobid之外,所有密钥都必须在保存时生成。我正试图完成什么?

+1

如果你问“EF是否跟踪新密钥并适当地更新孩子”,那么答案是“是” – MikeH 2014-11-20 21:07:14

+0

即使孩子会从父母双方获得新密钥吗? – user3738893 2014-11-20 21:15:57

回答

1

这里制作的一些假设,让我知道如果我是关闭基地。如果你的场景如下图所示,那么你应该没问题。

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(); 

你说“一笔交易”,但现实是有几笔交易发生。

  • myHolesmyOrders将被插入到数据库中与它们JobId适当设定。
  • EF会发现它们的ID是什么
  • myToolsmyToolHoles将与HoleIdOrderId组在第二步中的值插入。
+1

当然你也可以用'using'包装你的代码,并使用'BeginTransaction()'''Commit()'和'Rollback()'。 – 2014-11-20 21:32:00

+0

所以我需要将工具/工具孔映射到孔和订单?我之前尝试过,并且发现有关发现冲突更改的错误。 – user3738893 2014-11-20 21:59:53

+0

那么他们现在如何关联? – MikeH 2014-11-20 22:20:57