2013-01-19 123 views
3

我具有以下表设置:实体框架:更新连接表

  • 订单(ID)
  • 产品(ID)[其中的ProductID 1和2已经存在]
  • OrderProduct(OrderId,ProductID)[订购和产品表格中的两个键FK'ng]

和我'尝试将记录添加到订购表分配2个产品中的顺序如下:

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

db.SaveChanges(); 

的问题是:当保存订单,两款产品都得到插入到DB,而不是引用已存在的产品记录。

请帮忙。谢谢。

+2

您正在创建2个新的产品对象。难道你不能从数据库中检索对象,并通过引用将它们存储在产品列表中? – bas

+0

@哈克斯,谢谢。你可以告诉我吗。有一个**引用的**产品反对创建一个包含更新** FK ** **所需的确切** PK **的新对象之间有什么区别。 – dan

+1

因为我认为EF没有按照您期望的方式工作。尝试下面的答案,看看这些表是如何在sqlserver中设计的。产品将用FK更新以订购。我不确定,但我认为你正试图做相反的事情。无论如何,我有下面的答案完全相同的东西,它的作品:)。希望我不会让它更混乱这种方式... :) – bas

回答

6

你应该分贝,而不是创造新产品,就像这个例子使用:

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); 
+0

@RoBYCoNTeless,解决了这个问题。进一步如果我可能会问这是什么**“更新参考”**保存,它是在EF ** ObjectSet **或** ObjectContext **?作为一个学习点,你可以在这个**参考**方面稍微详细一点。谢谢。 – dan

+0

引用存储在对象的EntityState内(本例中为Product)。对象上下文处理这些状态,并能够理解需要执行哪种操作。当你使用attach方法时,你的实体被标记为“未更改”,这意味着,由于元素被存储,数据不会被改变,并且在调用“SaveChanges”后,Entity Framework会自动“查找”相关对象连接。我希望这个链接可以帮助你更好,然后我试着去做:http://msdn.microsoft.com/en-us/library/bb896271%28v=vs.90%29.aspx –