EF 基类成员
本文关键字:成员 基类 EF | 更新日期: 2023-09-27 18:07:57
我有一个表示对象 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(添加迁移、更新数据库(将此类作为表 A 将此类脚手架放入数据库中
我还有另外三个具有相似属性的对象 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 脚手架进入数据库时,我在任何表中都没有看到任何 FK,并且 A 和 B,C,D 之间没有链接......
问题是:如何搭建此类链接的正确方法是什么?提前感谢!
对于只有几个模型,您应该使用每个类型表的继承。您还应该为 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();
}