【问题标题】:Entity Framework: Updating join tables实体框架:更新连接表
【发布时间】:2013-01-19 11:11:46
【问题描述】:

我有以下表格设置:

  • 订单 (ID)
  • 产品 (ID) [其中 ProductID 1 和 2 已经存在]
  • OrderProduct(OrderId、ProductID)[两个键 FK'ng 到 Order 和 Product 表]

我正在尝试向 Order 表添加一条记录,将 2 个产品分配到订单中,如下所示:

var order = new Order();
order.Products.Add(new Product {ID=1});
order.Products.Add(new Product {ID=2});

db.SaveChanges();

问题是:保存订单时,两个产品被插入到数据库中,而不是引用已经存在的产品记录。

请帮忙。谢谢。

【问题讨论】:

  • 您正在创建 2 个新的 Product 对象。您不能从数据库中检索对象并通过引用将它们存储在您的产品列表中吗?
  • @Haxx,谢谢。你可以告诉我吗。 referenced 产品与创建包含更新 FK'S 所需的确切 PK's 的新对象有什么区别。
  • 因为我认为 EF 不能按照您期望的方式工作。试试下面的答案,看看表是如何在 sqlserver 中设计的。将使用 FK 更新产品以进行订购。我不确定,但我认为你正试图做相反的事情。无论如何,我的答案与下面的完全相同,并且有效:)。希望我不会以这种方式让事情变得更加混乱...... :)

标签: c# entity-framework orm ado.net


【解决方案1】:

您应该使用 db 而不是创建新产品,如下例所示:

var order = new Order();
order.Products.Add(db.Products.First(p => p.ID = 1));
order.Products.Add(db.Products.First(p => p.ID = 2));

db.SaveChanges();

或者,您需要在产品创建后“更新参考”。 你可以这样做:

var product = new Product() { ID = 1 };
db.Attach(product);
order.Products.Add(product);

【讨论】:

  • @RoBYCoNTeless,解决了这个问题。此外,如果我可能会问这个 "Update Reference" 保存在哪里,它是在 EF ObjectSet 还是 ObjectContext 中?作为我的学习点,您能否详细说明一下这个“参考” 方面。谢谢。
  • 引用存储在对象的 EntityState 中(在本例中为 Product)。对象上下文处理这些状态并且能够理解需要执行什么样的操作。当您使用 attach 方法时,您的实体被标记为“未更改”,这意味着,由于存储了元素,数据没有更改,之后,当您调用“SaveChanges”时,Entity Framework 会自动“查找”相关对象到附。我希望这个链接能比我尝试做的更好地帮助你:msdn.microsoft.com/en-us/library/bb896271%28v=vs.90%29.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多