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 之间没有链接......

问题是:如何搭建此类链接的正确方法是什么?提前感谢!

EF 基类成员

对于只有几个模型,您应该使用每个类型表的继承。您还应该为 POCO 使用自动实现的属性。当属性访问器中不需要其他逻辑时,应使用它们。

如果BCD包含与A相似的属性,它们应该从中继承。如果BCD必须包含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();
}