【问题标题】:Entity Framework multiple foreign keys to the same table实体框架对同一个表的多个外键
【发布时间】:2015-03-17 22:47:07
【问题描述】:

我有两个实体 DataTag 和 CalcDataTag:

public class CalcDataTag : BaseModel
{
    [Column("CalcDataTagId")]
    public override Guid ID { get; set; }

    public Guid DataTagId { get; set; }
    public DataTag DataTag { get; set; }

    public Guid ChildDataTagId { get; set; }
    public DataTag ChildDataTag { get; set; }
}

public class DataTag : BaseModel
{
    [Column("DataTagId")]
    public override Guid ID { get; set; }

    public ICollection<CalcDataTag> CalcDataTags { get; set; }
}

我这样设置上下文:

modelBuilder.Entity<DataTag>()
            .HasMany<CalcDataTag>(x => x.CalcDataTags)
            .WithRequired(x => x.ChildDataTag)
            .HasForeignKey(x => x.ChildDataTagId);

        modelBuilder.Entity<DataTag>()
            .HasMany<CalcDataTag>(x => x.CalcDataTags)
            .WithRequired(x => x.DataTag)
            .HasForeignKey(x => x.DataTagId);

CalcDataTags 列表应该是 CalcDataTags 列表,其中 DataTagId 或 ChildDataTagId 等于 DataTag 的 ID,但设置上下文的方式,底部设置覆盖顶部设置,我只得到一个 CalcDataTags 列表,其中DataTagId 等于 DataTag 的 ID。如果我切换设置,那么我只会得到一个 CalcDataTags 列表,其中 ChildCalcDataTagId 等于 DataTag 的 ID。基本上我想要得到的是两个列表的联合。每个实体只有一个 PrimaryKey,没有复合键。

【问题讨论】:

  • 你的意思是复合外键吗? .HasForeignKey(x =&gt; new { x.DataTagId, x.ChildDataTagId });.
  • In CalcDataTag I have two foreign keys to CalcDataTag (DataTag and ChildDataTag) and in DataTag I have a list of CalcDataTags. 这有点令人困惑。最终结果表应该是什么样子?或者你能上传ER图吗?
  • 刚刚澄清,添加实体代码是否更有意义?

标签: c# entity-framework


【解决方案1】:

您的DataTag 表上需要有第二个集合。没有其他方法可以解决它。实体框架变得混乱,因为它只能将一对多关系映射到特定属性,而不是两个。您需要执行以下操作:

DataTag:

public ICollection<CalcDataTag> CalcDataTags { get; set; }
public ICollection<CalcDataTag> ChildCalcDataTags { get; set; }

在你的modelBuilder:

modelBuilder.Entity<DataTag>()
            .HasMany<CalcDataTag>(x => x.ChildCalcDataTags)
            .WithRequired(x => x.ChildDataTag)
            .HasForeignKey(x => x.ChildDataTagId);

modelBuilder.Entity<DataTag>()
            .HasMany<CalcDataTag>(x => x.CalcDataTags)
            .WithRequired(x => x.DataTag)
            .HasForeignKey(x => x.DataTagId);

如果您希望能够同时获取所有这些(看起来您确实这样做了),您可能需要考虑添加一个 [NotMapped] 属性,该属性将获取两个集合的并集,如所以:

[NotMapped]
public ICollection<CalcDataTag> AllCalcDataTags
{
  return CalcDataTags.Union(ChildCalcDataTags);
}

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多