我有一个代表对象A的类:
public class A
{
[Key]
private int _ID;
private string _property;
public ID {get {return _ID;} set {_ID = value;}}
public ID {get {return _property;} set {_property = value;}}
}
我使用EF(add-migration,update-database)
将此类作为表A加载到DB中我有另外三个具有模拟属性的B,C,D对象,所以我为它们创建了一个基类。所有这个对象必须包含一个A类型的对象列表,所以我创建了对A:
的引用public class Base_B_C_D
{
[Key]
protected int _ID;
protected string _prop;
protected List<A> A_List;
public ID {get {return _ID;} set {_ID = value;}}
public ID {get {return _prop;} set {_prop = value;}}
}
并从中继承B,C,D:
public class B:Base_B_C_D {}
public class C:Base_B_C_D {}
public class D:Base_B_C_D {}
当我使用EF将B,C,D搭建到DB中时,在任何表中都看不到任何FK,并且A和B,C,D之间没有链接...
问题是:如何搭建此类链接的正确方法是什么? 提前谢谢!
答案 0 :(得分:0)
只有少数型号,您应该使用table-per-type inheritance。您还应该使用auto-implemented properties作为您的POCO。当属性访问器中不需要额外的逻辑时,应该使用它们。
如果B
,C
和D
包含与A
类似的属性,则他们应该继承它。如果B
,C
和D
必须包含A
对象的列表,则此关系表示为一对多关系。这在EF中使用ICollection
表示,它将充当FK。
根据您的模型,您可以实现TPT继承:
public class A
{
[Key]
public int ID { get; set; }
public string Property { get; set; }
}
[Table("B")]
public class B : A
{
// more properties...
// 1:Many with A
public ICollection<A> CollectionA { get; set; }
}
[Table("C")]
public class C : A
{
// more properties...
// 1:Many with A
public ICollection<A> CollectionA { get; set; }
}
[Table("D")]
public class D : A
{
// more properties...
// 1:Many with A
public ICollection<A> CollectionA { get; set; }
}
在上下文类中,您只创建一个类型基类的DbSet:
public class MyDbContext: DbContext
{
public DbSet<A> Person { get; set; }
}
在应用程序的某处,您可以创建派生类的实例:
using(var db = new MyDbContext())
{
var b = db.A.Create<B>();
// ... same for C and D
db.A.Add(b);
db.SaveChanges();
}