C# 映射异常表关系

C# 映射异常表关系,c#,entity-framework,ef-fluent-api,C#,Entity Framework,Ef Fluent Api,我想知道是否有人可以建议我如何解决使用FluentAPI映射两个表的问题 我有一个父表,它的键名为ID 然后是一个包含两个字段idA和idB的子表 父表中的主键链接到idA或idB,而不是两者 public Parent() { this.ChildA = new HashSet<Child>(); this.ChildA = new HashSet<Child>(); } public virtual IColle

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

我有一个父表,它的键名为ID 然后是一个包含两个字段idA和idB的子表

父表中的主键链接到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; }
}
公共父级()
{
this.ChildA=新的HashSet();
this.ChildA=新的HashSet();
}
公共虚拟ICollection ChildA{get;set;}
公共虚拟ICollection ChildB{get;set;}
}
公共儿童()
公共虚拟父级{get;set;}
}
对于关系/表设计,我可以做很多事情,因为它是遗留的,无法更改。只需了解正确的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);
modelBuilder.Entity();
modelBuilder.Entity().HasRequired(p=>p.parent).WithMany(q=>q.childs).HasForeignKey(r=>r.idB);

我相信我能够获得您要查找的正确映射。我在POCO中添加了导航属性,它允许实体框架知道如何在代码中使用外键

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);
modelBuilder.Entity().HasRequired(p=>p.ParentA).WithMany(q=>q.ChildA).Map(m=>m.MapKey(“idA”).WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(p=>p.ParentB).WithMany(q=>q.ChildB).Map(m=>m.MapKey(“idB”).WillCascadeOnDelete(false);
有了这一点,我指出
ParentA
填充
ChildA
集合,而
ParentB
填充
ChildB
集合。
Map
方法允许我映射到您已经存在的FK,并且我不必将它们作为属性包含在POCO中


请注意,映射到表的每个POCO都必须有一个主键。您已经存在的子表是否有PK?如果没有,你可能会有更多的麻烦。我建议你阅读这篇关于它的文章

子表根本没有主键。只是这愚蠢的头痛。谢谢你我会好好尝试的,非常感谢你的帮助。