EF脚手架基类成员

时间:2013-04-07 07:42:51

标签: c# inheritance entity-framework-4 scaffolding

我有一个代表对象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之间没有链接...

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

1 个答案:

答案 0 :(得分:0)

只有少数型号,您应该使用table-per-type inheritance。您还应该使用auto-implemented properties作为您的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();
}