[英]Entity Framework Code First TPH Discriminator Column
我使用的是帶有代碼優先級和按層次結構表(TPH)繼承的Entity Framework 6.0。
請參閱以下MWE(我省略了其他流利的api語句以闡明問題所在):
public abstract class Employee
{
public int EmployeeId { get; set; }
public string Type { get; set; }
}
public class CEO : Employee
{
public CEO() {Type = 1}
}
public class Other : Employee
{
}
public class InheritanceMappingContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Map<CEO>(m => m.Requires("Type").HasValue(1))
.Map<Other>(m => m.Requires("Type").HasValue(**<>1**));
}
}
我想將Type
列(應該是discriminator列)的所有1
條目映射到CEO
類。 對於列Type
所有條目的條目均不同於1
的條目都應映射到類Other
。
這里出現兩個問題。 第一個是如何編寫.HasValue(**<>1**));
作為正確的代碼。 第二件事是我想在代碼中使用Type
列,但是由於這是discriminator列,因此我無權對其進行訪問。
我不認為不可能在映射中使用非邏輯,並且我很確定不可能在您的類中將discriminator列作為屬性來訪問。
另外,我認為從概念上講是有問題的,也就是說,OOP繼承真的適用於這種情況嗎? 在OOP中,兄弟類不能在繼承層次結構中橫向轉換,只能上下轉換,例如,可以將蘋果轉換為水果,但不能將蘋果轉換為橙色。 在您的示例中,“其他”類型的員工可能有一天(有些運氣)成為CEO。 這是一個小問題,不太可能出現,可以通過直接(丑陋)修改SQL來解決,但這表明繼承不是解決問題的正確方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.