我有一个遗留数据库模式,我想用每个类型的实体框架映射进行建模。但是,基表和子类表使用不同的主键名称,而EF似乎不喜欢这样。
例如:
[Table("People")]
abstract class Person {
[Key, Column("Id")]
public int Id { get; set; }
// Person properties...
}
[Table("Employees")]
class Employee : Person {
[Key, Column("PersonId")]
public new int Id { get; set; }
// Employee-specific properties...
}
实际上这确实有效,至少对于阅读:Employee
被映射到People
表中的记录加上Employees
表中的记录。但是,实体框架不会填充Employee.Id
(它始终为零),因此我使用Employee.Id
作为[Obsolete]
进行注释,以确保我的其余代码不会尝试使用它
我担心以这种方式使用new
似乎是一个可怕的黑客攻击。
是否有更惯用/更正确的做法?
答案 0 :(得分:2)
好的......我有一点解决方案......问题是在基表和派生表上声明主键的不同键名的唯一方法是在派生类中再次声明键,并且EF没有为派生类上的键设置值,所以:
[Table("Employees")]
class Employee : Person {
[Key, Column("PersonId")]
public new int Id {get{return base.Id;}set{base.Id=value;}}
}
在派生类中声明键,但让它委托给基类中的键属性。当实体框架设置一个时,它会自动设置两个 - 这很好,因为根据定义它们必须是相同的。