映射不寻常的 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
我想知道是否有人可以建议我如何解决有关使用 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,我不必将它们作为 属性.
请注意,映射到 table 的每个 POCO 都必须有一个主键。你现有的childtable有PK吗?如果没有,您可能会遇到更多麻烦。我建议阅读这篇关于它的 SO post。 Entity Framework: table without primary key