2013-04-07 25 views
0

我有一个类表示对象A:EF脚手架基类成员

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;}} 
} 

我脚手架这个类成DB如表使用EF A(添加迁移,更新数据库)

我有另一个三个对象B,C,D具有类似属性,所以我为它们创建了一个基类。从它

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:所有这些对象必须包含类型A的对象的列表,以便创建参照甲

public class B:Base_B_C_D {} 
public class C:Base_B_C_D {} 
public class D:Base_B_C_D {} 

当我脚手架B,C, D到DB使用EF我没有看到任何表中的任何FK,并且没有链接之间A和B,C,D ...

问题是:什么是正确的方式如何搭建这样的链接? 在此先感谢!

回答

0

只有几个型号,你应该使用table-per-type inheritance。您还应该为您的POCO使用auto-implemented properties。在属性访问器中不需要额外的逻辑时应该使用它们。

如果B,CD包含与A类似的属性,它们应该从它继承。如果B,CD必须包含对象列表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(); 
} 
+0

此方法仅适用于B,C和D具有与BASE_B_C_D具有完全相同的属性,但是如果它们实现了更多属性(如您所写),那么这些属性将被存储在哪里,因为我们只有一个具有BASE_B_C_D属性列的DbSet?当我在B或者С或者D中包含List 时,我知道出现在A中的abuot FK ...但是如果我必须在每个派生类中包含List ,那么在那种情况下继承是什么?我们的目标是在BASE_B_C_D中包含List ,而不是在B或C或D中重写它,而只是通过继承来使用 – versus 2013-04-07 13:21:48

+0

当使用TPT继承时,我们只在类型基类的DbSet上创建。使用[Table(“...”)]注释派生类将为数据库中的每个派生类创建表,其中列将直接映射到派生类中的属性,即,这是存储其他属性的位置。我不太确定FK是否可以通过继承按照您描述的方式在EF中实现 - 我总是创建一个集合来表示“多”FK。继承允许重用代码并在类之间创建is-a关系。 – MattSull 2013-04-07 13:40:23