【发布时间】:2015-06-23 21:28:53
【问题描述】:
我想将两个派生类映射到两个表(TPT)
[Table("User")]
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
[Table("Employee")]
public class Employee : User
{
public int UserId { get; set; }
public string DeptName { get; set; }
}
表已经存在(即我无法修改架构)并且定义如下:
请注意,表Employee 中的列UserId 既是它的PK 也是表User 的列Id 的FK。
DbContext 尽可能直接 - 没有定义流畅的映射。
public class TestInheritContext : DbContext
{
public DbSet<User> Users { get; set; }
}
当尝试访问 Users 集合时,我收到以下 EF 异常:
System.Data.SqlClient.SqlException:列名“Id”无效。
显然,它试图从表 Employee 中读取列 Id。
我见过的所有 TPT 示例在所有表中都使用相同的 PK 列名。例如,this one。
我该如何解决?
【问题讨论】:
-
您是否尝试在您的
UserId属性上添加[Key("UserId")]? -
@jbl 该属性已映射到同名列。问题是,基类的
Id属性在类Employee中继承,EF 尝试从表Employee中的列Id中读取它,但该列不存在。 -
所以我猜你没有尝试 ;-) 我流畅地映射 TPT 层次结构,为父键列和子键列使用不同的列名。唯一需要的一点是在这两种类型中指定 Key 及其列名。
-
我确实试过了。同样的错误。顺便说一句,
[Key]属性 ctor 不带任何参数。我同时使用了[Key]和[Column("UserId")]。 -
@jbl 我已经检查过了。我很好奇
.OfType()是在数据库上还是在本地运行。很高兴地报告DbSet<Employee>和DbSet<User>.OfType<Employee>都可以工作并且生成的SQL 是相同的。相当整洁。
标签: entity-framework single-table-inheritance