实体框架:更新连接表

Posted

技术标签:

【中文标题】实体框架:更新连接表【英文标题】: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 更新产品以进行订购。我不确定,但我认为你正试图做相反的事情。无论如何,我的答案与下面的完全相同,并且有效:)。希望我不会以这种方式让事情变得更加混乱...... :) 【参考方案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

以上是关于实体框架:更新连接表的主要内容,如果未能解决你的问题,请参考以下文章

连接两个表实体框架

使用实体框架 4.1 进行多表连接,我应该使用 lambda 还是 LINQ?

实体框架将纯连接查找表转换为多对多关系

如何使用实体框架 6 按行号进行内部连接

如何使用实体框架进行连接表搜索?

如何让实体框架在不保存对象的情况下创建/更新数据库表