我在使用Entity Framework v6.1.1进行TPH继承中的鉴别器时遇到问题
我希望鉴别器应该落在代表 base 类的表上。但是,似乎EF试图将鉴别器列映射到映射到派生类的表
E.g。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Staff : Person
{
public decimal? Salary { get; set; }
}
public class MyContext : DbContext
{
public MyContext()
: base("MyConnectionString") {}
public virtual IDbSet<Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Map(x => x.ToTable("Person"))
.Map<Staff>(x => x.ToTable("Staff").Requires("PersonTypeId").HasValue(1));
}
}
我也在使用现有的架构 - 即:
CREATE TABLE Person
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name VARCHAR(50) NULL,
PersonTypeId INT NOT NULL
)
CREATE TABLE Staff
(
Id INT NOT NULL REFERENCES Person(Id),
Salary DECIMAL NULL
)
GO
但是,当我尝试添加新员工时,遇到以下异常:
'System.Data.SqlClient.SqlException:无法将值NULL插入列'PersonTypeId',表'MyDb.dbo.Person';列不允许空值。 INSERT失败。 该声明已被终止'
它似乎试图将鉴别器(错误地)插入到派生表中。希望有人可以提供帮助。
答案 0 :(得分:0)
所以我似乎误解了实体框架的TPH设置。
就我而言,我想将派生类型映射到单独的表,这是每个类型的表的示例 - http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt
在这种背景下,判别者是多余的。