如果多態性是必須的,那麼您需要使用每種類型的表(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();
}
你在看每種類型的表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 –
我在這裏看不到任何OOP模式的問題,你可以有兩個不同的類從同一個類繼承...你無法在C#中完成的唯一一件事(用C++你可以)有一個繼承自兩個不同類的類 – ppetrov
當涉及到類時,它不是一個問題,而是在初始化這將是。如果我有一個人的集合,他們中的每一個都可以是用戶或員工,但不能同時存在。這種多態性可以通過接口使用polymorpism來解決,但我認爲這不可能讓EF生成類,但通過接口處理繼承。 – user853710