【问题标题】:How do I save a child entity in EntityFramework 4?如何在 EntityFramework 4 中保存子实体?
【发布时间】:2011-04-15 16:29:02
【问题描述】:

我在订单和联系人之间是一对一的关系。即 Contact.OrderId 引用 Orders 也是一个 PK。

所以我有一个现有的订单,我像这样添加一个新的联系人......

    order.Contact = new Contact() { EmailAddress = "hello" };
    context.Orders.Attach(order);
    context.SaveChanges();

发生了参照完整性约束冲突:定义参照约束的属性值在关系中的主体对象和依赖对象之间不一致。

那我做错了什么?

【问题讨论】:

  • 哦,我明白了!订单需要附加到上下文之前联系人被分配给它。否则上下文不知道联系人已被添加!然后甚至不需要在联系人上设置 OrderId 字段。感谢您的帮助。

标签: c# .net entity-framework-4.1 ef-code-first


【解决方案1】:

只需生成您的子实体,设置其OrderIdReference 属性,您就可以开始了。

【讨论】:

  • 似乎有效。但我对我在对原始问题的评论中提到的行为感到困惑。
  • @Ian Warburton:我提出的这种技术是最快的,您可以绕过某些数据库调用。但是您所做的是在将实体附加到具体的数据库记录之前进行了一些更改。你总是必须先附加它,然后做你必须做的任何事情,然后提交你所做的所有更改。
  • 嘿罗伯特,我收回了。我犯了一个错误。当我在 Contact 对象上设置 OrderId 时,不会保存 Contact 对象。我需要告诉上下文联系人是新的吗?
  • 新建一个Contact,设置属性(包括OrderIdReference),添加到联系人表并保存。应该是这样,只要您的订单没有现有联系人(因为您说您有 1-1 参考)。
  • 不..它不适合我。联系人实体是否需要像这样添加,'context.Add(contactEntity);'因为我知道我可以将其添加到现有订单中,将订单“附加”到上下文中,EF 将在订单中找到新联系人。
【解决方案2】:

您与OrderContact 表中的共享主键是一对一的关系:联系人的PK 必须始终与关联订单的PK 相同。这会产生一些后果:

  • OrderContact 表中只有一个 PK 列可以是自动生成的标识。我假设它是 Order 表。
  • 如果order 在分配新联系人之前已经有Contact,则必须从数据库中明确删除旧联系人,因为您不能有两个具有相同OrderId 的联系人,因为它同时是PK。
  • 由于Contact 表没有标识列,您必须在代码中手动提供 PK,并且它必须是订单的 PK。

综合起来,它可能看起来像:

context.Orders.Attach(order);
if (order.Contact != null)
    context.DeleteObject(order.Contact);
order.Contact = new Contact() { OrderId = order.Id, EmailAddress = "hello" };
context.SaveChanges();

这假设 1) 如果在分配新联系人之前已经有联系人,则旧的 order.Contact 已加载到订单对象中,并且 2) Contact 的属性 OrderId 是 PK 属性。

【讨论】:

    【解决方案3】:

    只是一个猜测,但我认为您需要为您的联系人对象设置 pk。当您没有主键为空时,实体框架不喜欢它。

    【讨论】:

      【解决方案4】:

      新合约尚未添加:

      context.Orders.Attach(order);
      context.AddToContractSet(order.Contract);
      context.SaveChanges();
      

      这是假设order 已经在数据库中,并且您正在附加,因为它最初来自另一个上下文。如果没有,请执行以下操作:

      context.AddToORdersSet(order);
      context.SaveChanges();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2020-03-13
        相关资源
        最近更新 更多