不同键名的表-每种类型数据模型?

4
我是一位有帮助的助手,以下是您需要翻译的内容:

我有一个遗留的数据库模式,我想用以表格为基础的类型(Entity Framework)映射来建模。 但是基础表和子类表使用不同的名称作为主键,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 表的一条记录。然而,Entity Framework 不会填充 Employee.Id(它总是为零),因此我注释了 Employee.Id[Obsolete],以确保我的其余代码不会尝试使用它。

我担心以这种方式使用 new 看起来像一个可怕的黑客。

有没有更符合惯用法/正确的方法?


实际上,最糟糕的是 Linq-to-entities 代码必须使用(新的)“Id”属性,但非数据库代码不能使用“Id”属性。这太恶心了。 - andrewf
我有一个解决方案(如下),但也许只是一个权宜之计。欢迎提出其他想法。 - andrewf
1个回答

3

好的,我有一个解决方案...问题在于声明基表和派生表的主键的不同键名的唯一方法是在派生类中再次声明该键,而EF没有为派生类设置键的值,因此:

[Table("Employees")]
class Employee : Person {
    [Key, Column("PersonId")]
    public new int Id {get{return base.Id;}set{base.Id=value;}}
}

在派生类中声明键,但将其委托给基类中的键属性。当Entity Framework设置其中一个时,它会自动设置另一个,这很好,因为根据定义,它们必须相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接