【问题标题】:Save large entities and children with entity framework使用实体框架保存大型实体和子实体
【发布时间】:2014-11-20 21:01:02
【问题描述】:

我需要更新一个有两个孩子的实体,该实体还有两个都依赖于父母双方的孩子。

                            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 实体并调用 SaveChanges。如果我要添加新实体,则必须在保存时为除 Jobid 之外的所有实体生成密钥。我正在努力实现的目标是否可能?

【问题讨论】:

  • 如果您要问“EF 是否会跟踪新密钥并适当地更新子密钥”,那么答案是“是”
  • 即使孩子会从父母双方那里得到新钥匙?

标签: c# asp.net-mvc entity-framework


【解决方案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

【讨论】:

  • 当然你也可以用using包装你的代码,并使用BeginTransaction()Commit()Rollback()
  • 所以我需要将工具/工具孔映射到孔和订单?我之前尝试过,但收到有关检测到冲突更改的错误。
  • 那么它们现在是如何关联的呢?
  • 我发现我没有正确映射到孔。我添加它们的方式与添加到订单中的方式相同,但这是不正确的。感谢您的帮助。希望我可以利用这些知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多