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

Entity framework 4 实体框架4中的一对一错误,entity-framework-4,data-modeling,one-to-one,Entity Framework 4,Data Modeling,One To One,我已经阅读了,这不是重复的,因为这里的业务规则规范不同 有两张表,发票和订单 Invoices -> InvoiceID (Primary, Auto Number) Orders -> OrderID (Primary, Auto Number) -> InvoiceID (FK InvoiceID of Invoices Table) 现在的问题是,如果属性的名称不相同,EF需要此关联的一对多关系。若属性的名称相同,那个么它用于派生类,但这里的顺序不是派生类或发票 为每个

我已经阅读了,这不是重复的,因为这里的业务规则规范不同

有两张表,发票和订单

Invoices
-> InvoiceID (Primary, Auto Number)
Orders
-> OrderID (Primary, Auto Number)
-> InvoiceID (FK InvoiceID of Invoices Table)
现在的问题是,如果属性的名称不相同,EF需要此关联的一对多关系。若属性的名称相同,那个么它用于派生类,但这里的顺序不是派生类或发票

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

如果我为此创建一个单独的表,那么我必须编写太多的代码。我有没有办法取消这个限制,让EF继续处理我的模型

但是,当前如果我按如下所示更改模型,它会正常工作

Invoices
-> InvoiceID (Primary, Auto Number)
Orders
-> OrderID (Auto Number)
-> InvoiceID (Primary, FK InvoiceID of Invoices Table)
但这是一种好的做法吗?因为根据定义,Orders表的InvoiceID肯定是唯一的,但我们将在任何地方引用OrderID进行比较,并引用许多其他引用。我知道我可以索引的财产,但我不觉得这个设计是完美的


这里最明显的解决方案是更改发票之间的1:*关联 并在EDM中按1:1的比例排列。但是,正如您所经历的那样,映射不会 当模型中的两个实体之间存在外键关联时进行验证。

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

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

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

  • 从订单实体中删除InvoiceID外键属性
  • 选择发票和订单之间的关联
  • 在关联的属性窗口中,按打开引用约束 单击该属性旁边的椭圆
  • 通过单击“删除”按钮删除约束
  • 在设计器中的关联上单击鼠标右键,然后从关联菜单中选择“表映射”
  • 在“映射详细信息”窗口中,单击元素以显示下拉列表
  • 从下拉列表中,选择订单。映射应该自动填充
  • 返回关联的属性窗口
  • 对于名为“End2 Multiplicity”的属性,该属性当前具有值*Orders集合,请使用其下拉列表将该属性更改为1(Order之一)
  • 通过在设计图面上单击鼠标右键并选择“验证”来验证模型。您将看到与此映射相关的错误消息已消失。
  • 在应用程序中遇到此问题时,您必须决定哪个对您的模型和应用程序逻辑更重要:外键标量(例如Order.InvoiceID)还是能够在一个实体(发票)和另一个实体(订单)通过外键(InvoiceID)联接时定义它们之间的1:1关联。

    好消息是新的EF4.0延迟加载仍将与独立的关联一起工作,只是外键没有公开。要获得该信息,您必须转到导航属性(Invoice)并读取其InvoiceID,如下面的代码所示:

    Order order = context.Orders.First();
    int invoiceID = order.Invoice.InvoiceID;
    
    或者,您可以使用下面的代码在Order实体上正确读取它,而不必延迟加载或急切加载Invoice属性:

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

    谢谢,快速提问,如果我这样做,导航属性会起作用还是不起作用?没问题,它们当然会起作用,我更新了我的答案,向您展示了两种获取订单实体上隐藏的InvoiceId FK的方法。我花了大约一个小时的时间试图找出如何进行这种1:1映射,非常感谢Morteza!