Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:更新联接表_C#_Entity Framework_Orm_Ado.net - Fatal编程技术网

C# 实体框架:更新联接表

C# 实体框架:更新联接表,c#,entity-framework,orm,ado.net,C#,Entity Framework,Orm,Ado.net,我有以下表格设置: 订单(ID) 产品(ID)[其中产品ID 1和2已经存在] OrderProduct(OrderId,ProductID)[订单和产品表的两个键] 我正在尝试将一条记录添加到订单表中,将2种产品分配到订单中,如下所示: var order = new Order(); order.Products.Add(new Product {ID=1}); order.Products.Add(new Product {ID=2}); db.SaveChanges(); 问题是

我有以下表格设置:

  • 订单(ID)
  • 产品(ID)[其中产品ID 1和2已经存在]
  • OrderProduct(OrderId,ProductID)[订单和产品表的两个键]
我正在尝试将一条记录添加到订单表中,将2种产品分配到订单中,如下所示:

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

db.SaveChanges();
问题是:保存订单时,两个产品被插入数据库,而不是引用已经存在的产品记录


请帮忙。谢谢。

您应该使用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);

您正在创建2个新产品对象。您不能从数据库中检索对象并通过引用将其存储在产品列表中吗?@Haxx,谢谢。你能告诉我吗。与创建包含更新FK所需的确切PK的新对象相比,使用引用产品有什么区别?因为我认为EF不会以您期望的方式工作。试试下面的答案,看看这些表是如何在sqlserver中设计的。产品将更新为FK to order。我不确定,但我认为你正试图做相反的事情。不管怎么说,我的回答和下面的完全一样,它是有效的:)。希望我没有让事情变得更混乱…:)@robycontless,解决了问题。此外,如果我想问这个“更新引用”保存在哪里,它是在EF ObjectSet还是ObjectContext中?作为我的一个学习点,你能在这个“参考”方面多讲一点吗。谢谢。引用存储在对象(本例中为产品)的EntityState中。对象上下文处理这些状态,并且能够理解需要执行何种操作。当您使用attach方法时,您的实体被标记为“未更改”,这意味着,由于元素已存储,数据不会更改,之后,当您调用“SaveChanges”时,entity Framework会自动“查找”要附加的相关对象。我希望此链接可以帮助您更好地完成以下工作: