映射不寻常的 table 关系

Mapping unusual table relationships

我想知道是否有人可以建议我如何解决有关使用 FluentAPI 映射几个 table 的问题。

我的父 table 有我们的密钥 ID 然后是一个 Child table 有两个字段 idA & idB.

父 table 中的主键链接到 idA 或 idB,而不是两者。

public Parent()
    {
        this.ChildA = new HashSet<Child>();
        this.ChildA = new HashSet<Child>();
    }
    public virtual ICollection<Child> ChildA { get; set; }
    public virtual ICollection<Child> ChildB{ get; set; }
}

public Child()
    public virtual Parent parent { get; set; }
}

关于 relationship/table 设计,我可以做很多事情,因为它是遗留的,无法更改。只需要了解正确的 FluentAPI 即可解决此问题。上面的例子是我设想的需要的东西以及类似...

modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r =>  r.idA);
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r =>  r.idB);

我相信我能够获得您正在寻找的正确映射。我向 POCO 添加了导航属性,它允许 Entity Framework 知道如何在代码中使用外键。

public class Child
{
    public int Id { get; set; }
    public virtual Parent ParentA { get; set; }
    public virtual Parent ParentB { get; set; }

    public Child() { }
}

为了将这些导航属性映射到您已经存在的外键列,我使用了 FluentAPI Map 方法。

modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentA).WithMany(q => q.ChildA).Map(m => m.MapKey("idA")).WillCascadeOnDelete(false);
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentB).WithMany(q => q.ChildB).Map(m => m.MapKey("idB")).WillCascadeOnDelete(false);

有了这个,我已经指出 ParentA 填充了 ChildA 集合,并且 ParentB 填充了 ChildB 集合。 Map 方法允许我映射到您现有的 FK,我不必将它们作为 属性.

包含在 POCO 中

请注意,映射到 table 的每个 POCO 都必须有一个主键。你现有的childtable有PK吗?如果没有,您可能会遇到更多麻烦。我建议阅读这篇关于它的 SO post。 Entity Framework: table without primary key