实体框架可选的一对一关系不起作用

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 我知道了,他可能需要直接使用上下文映射。我不认为他只能用属性来做到这一点。

以上是关于实体框架可选的一对一关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩的关系多对一不起作用

实体框架中的可选一对多关系[关闭]

打字稿'可选'(可为空)'?语法不起作用(部分)

使用带有实体框架的 winform 应用程序部署的应用程序在客户端 PC 上不起作用

Doctrine ORM ManyToOne Inverse 不起作用

Swift 可选链在闭包中不起作用