C# 映射异常表关系
我想知道是否有人可以建议我如何解决使用FluentAPI映射两个表的问题 我有一个父表,它的键名为ID 然后是一个包含两个字段idA和idB的子表 父表中的主键链接到idA或idB,而不是两者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
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() { }
}
为了将这些导航属性映射到已有的外键列,我使用了FluentAPImap
方法
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?如果没有,你可能会有更多的麻烦。我建议你阅读这篇关于它的文章 子表根本没有主键。只是这愚蠢的头痛。谢谢你我会好好尝试的,非常感谢你的帮助。