2013-03-30 94 views
0

考慮到OOP,它應該是不可能的,但考慮到EF和繼承的方式在數據庫級別上工作,我想知道EF是否允許對同時繼承同一對象的子類對象進行連接。 我的意思是....讓我們考慮一下我有一個名爲person的表作爲parrent表,並且有兩個表從它繼承,它命名爲user,另一個名爲enployee。 由於EF中的繼承映射工作原理是跟蹤子表和父表中的相同主鍵,因此應該可以擁有person類並能夠將其轉換爲employee或user類。 我認爲必須對EF生成的代碼進行一些修改。C#EF繼承

+1

你在看每種類型的表http://weblogs.asp.net/manavi/archive/2010/12/28/繼承的MAPP ing-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt.aspx –

+0

我在這裏看不到任何OOP模式的問題,你可以有兩個不同的類從同一個類繼承...你無法在C#中完成的唯一一件事(用C++你可以)有一個繼承自兩個不同類的類 – ppetrov

+0

當涉及到類時,它不是一個問題,而是在初始化這將是。如果我有一個人的集合,他們中的每一個都可以是用戶或員工,但不能同時存在。這種多態性可以通過接口使用polymorpism來解決,但我認爲這不可能讓EF生成類,但通過接口處理繼承。 – user853710

回答

1

如果多態性是必須的,那麼您需要使用每種類型的表(TPT)或每層次表(TPH)繼承。當TPG用於具有很多表格的域模型和TPT時,當表格數量較少時,域模型越大,查詢就會變得混亂。

TPT代表關係的一部分。用戶是個人,用戶是員工。你打算在什麼你在你的問題說,你可以使用TPT像這樣:

public abstract class Person 
{ 
    public int PersonId  { get; set; } // EF will set this as PK 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

[Table("User")] 
public class User : Person 
{ 
    public string SomeUserProperty { get; set; } 
} 

[Table("Employee")] 
public class Employee : Person 
{ 
    public string SomeEmployeeProperty { get; set; } 
} 

然後在您的Context類,你只能創建一個DbSet它的類型是基類:

public class MyDbContext: DbContext 
{ 
    public DbSet<Person> Person { get; set; } 
} 

然後在你想要創建用戶或員工實例的應用程序的某些部分中:

using (var db = new MyDbContext()) 
{ 
    var user = db.Person.Create<User>(); 
    user.SomeUserProperty = "I'm a user"; 

    var emp = db.Person.Create<Employee>(); 
    emp.SomeEmployeeProperty = "I'm an employee"; 

    db.Person.Add(user); 
    db.Person.Add(emp); 
    db.SaveChanges(); 
}