实体框架可选的一对一关系不起作用
Posted
技术标签:
【中文标题】实体框架可选的一对一关系不起作用【英文标题】:Entity Framework Optional One To One Relationship Doesn't Work 【发布时间】:2018-02-15 01:34:35 【问题描述】:我有很多实体。其中一个OrderLine
实体使用了一些关系。它与AccountTransaction
相关。当我从上下文中获得AccountTransaction
类时,我可以通过延迟加载获得OrderLine
记录。但是当我从上下文AccountTransaction
获得OrderLine
类时,导航属性为空。
我怎么解决这个问题?
public partial class OrderLine : Base
[Key, ForeignKey("AccountTransaction")]
public int OrderLineId get; set;
public virtual AccountTransaction AccountTransaction get; set;
public class AccountTransaction
[Key]
public int TransactionId get; set;
[ForeignKey("OrderLine")]
public int? OrderLineId get; set;
public virtual OrderLine OrderLine get; set;
var orderLine = context.OrderLines.Find(167069);
var accTransaction = context.AccountTransactions.Find(38770);
//orderLine.AccountTransaction; //here account transaction is null
//accTransaction.OrderLine;//here orderLine is not null.
【问题讨论】:
【参考方案1】:您误用了[ForeignKey]
。它用于指定子记录中关系的关键字段,在本例中为AccountTransaction
。尝试将您的模型更改为以下内容:
public partial class OrderLine : Base
[Key]
public int OrderLineId get; set;
public virtual AccountTransaction AccountTransaction get; set;
public class AccountTransaction
[Key]
public int TransactionId get; set;
[Index(IsUnique=true)]
public int? OrderLineId get; set;
[ForeignKey("OrderLineId")]
public virtual OrderLine OrderLine get; set;
让我知道它是否有效或您是否遇到其他问题。 :)
【讨论】:
我试过了,但我提出了这个异常。 AccountTransaction_OrderLine_Source::多重性在关系“AccountTransaction_OrderLine”中的角色“AccountTransaction_OrderLine_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*' 是的,因为这种结构不遵循正常的 1:1 模式,而是 1:many。尝试将[Index(IsUnique=true)]
添加到AccountTransaction.OrderLineId
以查看是否可以解决问题。我也会编辑我的答案。
我几乎可以肯定 1:1 关系需要直接通过两个实体的键而不是附加属性。尝试将[Key]属性移到OrderLineId,将类型改为int(因为这个值不能为空)
@Miguel 从技术上讲,他想要的是 1:0..1 的关系,而不是真正的 1:1。拥有一个共享的主键可能会更好,但不知道更多关于这里的实际结构并且不确定 1:many 关系不会更好,我不会建议架构更改。 :)
@CptRobby 我知道了,他可能需要直接使用上下文映射。我不认为他只能用属性来做到这一点。以上是关于实体框架可选的一对一关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用带有实体框架的 winform 应用程序部署的应用程序在客户端 PC 上不起作用