Entity Framework 与不同的表一对零

Entity Framework one-to-zero with different tables

我想知道是否可以制作一个 table 与许多相关的内容。

这就是我现在得到的(ReportReportHeader 之间的一对一关系):

public class Report
{
  public int Id {get; set;}
  public ReportHeader ReportHeader {get; set;}

  [ForeignKey("ReportHeader")]
  public int ReportHeaderId {get; set;}
}

public class ReportHeader
{
  [Key, ForeignKey("Report")]
  public int Id {get; set;}

  public Report Report {get; set;}
}

此时我想将名为 Style 的 table 添加到 Report,但也添加到 table ReportHeader。因此,关系看起来像这样:

Report
|--ReportHeader
|   |-- Style
|
|-- Style

之后 classes 应该如下所示:

public class Report
{
  public int Id {get; set;}

  public ReportHeader ReportHeader {get; set;}
  public Style Style {get; set;}

  [ForeignKey("ReportHeader")]
  public int ReportHeaderId {get; set;}

  [ForeignKey("Style")]
  public int StyleId {get; set;}
}

public class ReportHeader
{
  [Key, ForeignKey("Report")]
  public int Id {get; set;}

  [ForeignKey("Style")]
  public int StyleId {get; set;}

  public Report Report {get; set;}
  public Style Style {get; set;}
}

这太有趣了...直到想到 Style class。在这一点上,我不知道如何设计它。甚至有可能使 class 与不同的 table 处于两种关系中吗?

public class Style
{
  // ???
  //[Key, ForeignKey("Report"), ForeignKey("ReportHeader")]
  public int Id {get; set;}

  public ReportHeader ReportHeader {get; set;}
  public Report Report {get; set;}
}

在这种情况下,您应该屏蔽您想要的关系:一对一和多对一:

public BaseClass
{
    //indeed, collection always will have zero or one items
    public virtual ICollection<Style> styles {get; set;}

    [NotMapped]
    public Style style {
       get { return styles.FirstOrDefault(); } 
       set { styles.Add(value); };
    }
}

public class Report : BaseClass
{
    //other stuff...
}

public class ReportHeader : BaseClass
{
    //other stuff...
}

public class Style
{
    public int Id {get; set;}

    public virtual Report report {get; set;}
    [Index(IsUnique = true)]//to ensure that relation is exactly one-to-one
    public int? reportId {get; set;}

    public virtual ReportHeader reportHeader {get; set;}
    [Index(IsUnique = true)]//to ensure that relation is exactly one-to-one
    public int? reportHeaderId {get; set;}
}