0

我有一个代表对象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 脚手架到 DB 中时,我在任何表中都看不到任何 FK,并且 A 和 B、C、D 之间没有链接......

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

4

1 回答 1

0

只有少数模型,您应该使用table-per-type 继承。您还应该为您的 POCO 使用自动实现的属性。当属性访问器中不需要额外的逻辑时,应该使用它们。

如果B,CD包含与它们相似的属性,A则应该从它继承。如果且必须包含 的对象列表B,则此关系表示为一对多关系。这在 EF 中使用 an 表示,它将充当 FK。CDAICollection

根据您的模型,您可以像这样实现 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();
}
于 2013-04-07T12:11:58.853 回答