使用实体框架将现有实体添加到新创建的实体上的集合中

kir*_*son 8 many-to-many entity-framework

我正在使用Entity框架来创建新订单.该订单包含一系列联系人,多对多关系.我想在创建订单时添加对订单上现有联系人的引用.订购和联系实体对象.

 Order order = new Order();

 //set details on order

 Contact contact = new Contact();

 EntityKey contactKey =
                    new EntityKey("OrderDetails.Contact",
                        "contact_id", contact.Key.Id);

 contact.EntityKey = contactKey;
 contact.contact_id = contact.Key.Id;

 order.Contact.Attach(contact);  // throws an exception!

 OrderDetails ordTable = new OrderDetails();
            ordTable.AddToOrder(order);
            int result = orgTable.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

当我去附加时,抛出此异常:

"当与此相关端相关联的源对象处于添加,删除或分离状态时,附加不是有效操作.使用NoTracking合并选项加载的对象始终是分离的."

我知道我可能错过了一步或者没有完全理解实体框架如何处理多对多关系.

Mic*_*rry 5

不允许"附加",因为您尚未保存订单.调用"添加"会告知实体框架您要插入新联系人.所以你只剩下一个选择.您需要加载联系人.

这是最快的方法:

OrderDetails context = new OrderDetails();
Contact contact = context.GetObjectByKey(new EntityKey("OrderDetails.Contact", "contact_id", existingContactId));
order.Contact.Add(contact);
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以创建一个存根实体(使用您知道的密钥)将其附加到Context(而不是集合),然后将该子添加到集合中.有关更多信息,请参见技巧26:http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx (5认同)

Cra*_*ntz 3

如果 Order 有一个属性 Contact,那么你可以这样做:

order.Contact.Add(contact);
Run Code Online (Sandbox Code Playgroud)

不过,我建议将该属性称为“Contact 而不是“Contact”。