代码之家  ›  专栏  ›  技术社区  ›  Akash Kava

实体框架4中的一对一错误

  •  3
  • Akash Kava  · 技术社区  · 15 年前

    Entity Framework One-To-One Mapping Issues 这不是重复的,因为这里的业务规则规范不同。

    有两张桌子,发票和订单。

    Invoices
    -> InvoiceID (Primary, Auto Number)
    Orders
    -> OrderID (Primary, Auto Number)
    -> InvoiceID (FK InvoiceID of Invoices Table)
    

    为每个购物车生成InvoiceID,但OrderID仅为已付发票生成,因此每个订单都有InvoiceID,但每个订单都没有相应的发票。

    如果我为此创建一个单独的表,那么我必须编写太多的代码来完成它。有什么方法可以消除这个限制,让EF仍然处理我的模型。

    Invoices
    -> InvoiceID (Primary, Auto Number)
    Orders
    -> OrderID (Auto Number)
    -> InvoiceID (Primary, FK InvoiceID of Invoices Table)
    

    但这是好的做法吗?因为根据定义,Orders表的InvoiceID肯定是唯一的,但是我们将到处引用OrderID进行比较和许多其他引用。我知道我可以索引的财产,但我觉得这个设计是不完美的。

    One to One Error

    1 回复  |  直到 8 年前
        1
  •  2
  •   Morteza Manavi    15 年前

    这里最明显的解决方案是更改1:*发票之间的关联 在电火花加工中形成1:1的关联。但是,根据您的经验,映射将不会 外键协会 在你的模型中的两个实体之间。

    映射唯一外键关联的唯一方法是使用 独立协会

    将外键关联转换为独立关联意味着从Order实体中删除InvoiceID外键,并通过映射重新创建关联。

    要更改关联,您需要执行以下操作:

    1. 选择发票和订单之间的关联。
    2. 在关联的“属性”窗口中,通过
    3. 通过单击“删除”按钮删除约束。
    4. 在设计器中的关联上单击鼠标右键,然后从上下文菜单中选择“表映射”。
    5. 在“映射详细信息”窗口中,单击
    6. 从下拉列表中,选择“顺序”。映射应该自动填充。
    7. 返回关联的属性窗口。
    8. 对于名为End2 Multiplicity的属性(当前具有Orders的值*集合),请使用其下拉列表将该属性更改为1(Order的一个)。
    9. 通过右键单击设计图面并选择“验证”来验证模型。您将看到与此映射相关的错误消息已消失。

    当在应用程序中遇到此问题时,您必须决定哪个对您的模型和应用程序逻辑更重要:外键标量(例如Order.InvoiceID)或当一个实体(Invoice)和另一个实体(Order)通过外键(InvoiceID)连接时,能够定义它们之间的1:1关联。

    好消息是新的EF4.0 延迟加载 仍将与独立协会合作,只是外键不公开。要获取此信息,您必须转到导航属性(Invoice)并读取其InvoiceID,如下面的代码所示:

    Order order = context.Orders.First();
    int invoiceID = order.Invoice.InvoiceID;
    

    int invoiceID = order.InvoiceReference.EntityKey.EntityKeyValues[0].Value;