2009-01-02 88 views
8

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

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(); 

当我去重视,这将引发异常:

“附加是不是有效的操作时,与此相关的结束相关的源对象是在添加,删除或脱管状态的对象。使用NoTracking合并选项加载的内容总是被分离。“

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

回答

3

如果订单有一个属性联系,那么你可以做:

order.Contact.Add(contact); 

我建议一种名为联系小号,而不是直接与酒店联系,但。

5

不允许“附加”,因为您尚未保存订单。调用“添加”会告诉Entity Framework您想插入一个新联系人。所以你只剩下一个选项。您需要加载联系人。

下面是做到这一点的最快方法:

OrderDetails context = new OrderDetails(); 
Contact contact = context.GetObjectByKey(new EntityKey("OrderDetails.Contact", "contact_id", existingContactId)); 
order.Contact.Add(contact); 
+5

或者你可以创建一个存根实体(你知道密钥),附上的上下文(不是集合),然后将子添加到收藏。更多信息,请参阅提示26:http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx – 2009-12-16 05:35:05

相关问题