gpt4 book ai didi

entity-framework-4 - Entity Framework 4 中的一对一错误

转载 作者:行者123 更新时间:2023-12-04 07:51:03 24 4
gpt4 key购买 nike

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

有两个表,Invoices 和 Orders。

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

现在的问题是,如果属性名称不同,EF 需要为此关联建立一对多关系。如果属性名称相同,则它用于派生类的目的,但这里的订单不是派生类或发票。

InvoiceID(s) 为每个购物车生成,但 OrderID(s) 仅为已付款发票生成,因此每个订单都有 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

最佳答案

这里最明显的解决方案是更改 Invoice 之间的 1:* 关联和 Order 在 EDM 中变成 1:1 关联。但是,正如您所经历的那样,映射不会当您在模型中的两个实体之间具有外键关联 时进行验证。

映射唯一外键关联的唯一方法是使用 独立关联。这与我们在 EF3.5 中使用的关联类型相同,其中不支持外键。

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

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

  1. 从 Order 实体中删除 InvoiceID 外键属性。
  2. 选择发票和订单之间的关联。
  3. 在关联的“属性”窗口中,通过以下方式打开“参照约束”单击该属性旁边的省略号。
  4. 单击“删除”按钮删除约束。
  5. 在设计器中右键点击关联,然后从上下文菜单中选择表映射。
  6. 在“映射详细信息”窗口中,单击 元素以显示下拉列表。
  7. 从下拉菜单中选择订单。映射应自动填充。
  8. 返回关联的“属性”窗口。
  9. 对于当前值为 * Collection of Orders 的名为“End2 Multiplicity”的属性,使用其下拉列表将该属性更改为 1(顺序之一)。
  10. 通过右键单击设计图面并选择“验证”来验证模型。您会看到与此映射相关的错误消息消失了。

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

好消息是新的 EF4.0 Lazy Loading 仍将与 Independent Associations 一起工作,只是没有公开外键。为此,您必须转到导航属性 (Invoice) 并像下面的代码一样读取其 InvoiceID:

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

或者您可以使用下面的代码直接在 Order 实体上读取它,而不必延迟加载或预先加载 Invoice 属性:

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

关于entity-framework-4 - Entity Framework 4 中的一对一错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com