2013-04-07 4 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를이 클래스를 스캐 폴딩 나는 다른이 3 개의 객체 B, C, D를 모의 속성으로 처리하므로 기본 클래스를 만듭니다. 그것에서 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;}} 
} 

및 상속 :이 모든 객체가 나는 A와 참조를 만들 수 있도록 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의 경우 CDA과 유사한 속성을 포함해야합니다. B, CDA의 개체 목록이 포함되어야하는 경우이 관계는 일대 다 관계로 표시됩니다. 이것은 ICollection을 사용하여 EF에서 표현되며 FK로 작동합니다. 당신은 단지 형의 기본 클래스 중 하나 DbSet을 만들, 당신의 문맥 클래스에서

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

: 당신의 모델을 기반으로

, 당신은 TPT의이 같은 상속을 구현할 수

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에 목록 을 포함하고 B 또는 C 또는 D에 다시 쓰지 않고 상속을 통해 만 사용하는 것입니다. – versus

+0

TPT 상속을 사용할 때는 기본 클래스 유형의 DbSet에서만 만듭니다. [Table ("...")]을 사용하여 파생 클래스에 주석을 추가하면 파생 클래스의 속성에 직접 매핑되는 열, 즉 추가 속성이 저장되는 열과 함께 데이터베이스의 각 파생 클래스에 대한 테이블이 만들어집니다. 나는 FK가 당신이 묘사하는 방식으로 상속을 통해 EF에서 실현 될 수 있는지 확신 할 수 없다. 나는 항상 'many'FK를 표현할 컬렉션을 생성한다. 상속은 코드 재사용을 허용하고 클래스 간의 is-a 관계를 만듭니다. – MattSull