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

qua*_*els 3 entity-framework ef-code-first

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

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

用户类

public class User
{
    public int Id {get;set;}
    public string Username {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

管理员班

public class Admin : User { }
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,Discriminator如果我想User进入并且如何更新列Admin

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

谢谢你的帮助.

Cra*_*ntz 5

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

例如,你可以有一个之间的关联User对象和Administrator对象,而不是想要取代User与对象Administrator亚型.

我在一篇旧博客文章中写到了这个想法:

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

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

  • @quakkels:*这可能需要对我正在处理的应用程序进行一些深入的重构*不幸的是,如果您错误地理解了应用程序的需求并使用了错误的设计,通常会发生这种情况.滥用继承是人们在其应用程序中可以做的最糟糕的事情之一,因为在开发的后期阶段修复这样的设计错误总是很昂贵. (3认同)