如何在EntityFramework中更改自动生成的“Discriminator”列?

时间:2012-05-23 21:23:56

标签: entity-framework ef-code-first

我正在研究一些通过EF4.3使用单表继承的代码。

有一个名为User的实体和另一个名为Admin的实体。 Admin继承自用户。

用户类

public class User
{
    public int Id {get;set;}
    public string Username {get;set;}
}

管理员课程

public class Admin : User { }

EF使用Discriminator列生成数据库表。添加Admin记录后,Discriminator="Admin"和用户记录将Discriminator="User"

我的问题是,如果我想要DiscriminatorUser,我该如何更新Admin列?

我尝试从一种对象类型转换为另一种对象并使用EF保存。但这不会改变Discriminator列。我该如何更改?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

对象永远不能改变它们的类型。如果您打算更改用户的“管理员”设置(合理),则应使用属性/属性,而不是类型名称。

例如,您可以在User对象和Administrator对象之间建立关联,而不是希望用{{替换 User对象{1}}子类型。

I wrote about this idea in an old blog post

  

在设计良好的对象关系映射时,您必须克服的一个心理障碍是倾向于主要以面向对象的术语或关系术语来思考,以适合您的个性。但是,良好的对象关系映射包含了良好的对象模型和良好的关系模型。例如,假设您有一个包含People表的数据库,以及Employees和Customers的相关表。一个人可能在所有三个表中都有记录。现在,从严格的关系角度来看,您可以为员工构建数据库VIEW,为客户构建另一个数据库VIEW,这两者都包含People表中的信息。当使用一个VIEW或另一个时,您可以暂时将个人视为“只是”员工或“只是”客户,即使您知道他们两者都是。所以来自这个世界观的人可能会想要进行OO映射,其中Employee和Customer都是Person的(直接)子类。但这不适用于我们拥有的数据;由于单个人同时拥有员工和客户记录(并且由于任何Person实例都不能同时具有子类型Employee和Customer),因此Person和Employee之间的OO关系需要是组合而不是继承,对于Person和Customer也是如此。

要直接回答您的问题,无法使用EF更改此列。当然,你可以用直接的SQL来做。但由于上面给出的原因,我鼓励你改变这种设计。