【问题标题】:Using the entity framework to add existing entities to a collection on a newly created entity使用实体框架将现有实体添加到新创建实体的集合中
【发布时间】:2010-09-29 07:02:19
【问题描述】:

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

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

我去attach的时候,抛出这个异常:

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

我知道我可能遗漏了一步,或者没有完全理解实体框架如何处理多对多关系。

【问题讨论】:

    标签: entity-framework many-to-many


    【解决方案1】:

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

    order.Contact.Add(contact);
    

    不过,我建议将属性命名为 Contacts 而不是 Contact。

    【讨论】:

      【解决方案2】:

      “附加”是不允许的,因为您还没有保存订单。调用“添加”会告诉实体框架您要插入一个新联系人。所以你只剩下一个选择。您需要加载联系人。

      这是最快的方法:

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

      【讨论】:

      • 或者您可以创建一个存根实体(使用您知道的密钥)将其附加到上下文(而不是集合),然后将子实体添加到集合中。有关更多信息,请参阅提示 26:blogs.msdn.com/alexj/archive/2009/06/19/…
      • 太棒了!是的,他说的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2019-04-13
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2012-10-28
      • 2023-04-10
      相关资源
      最近更新 更多