Entity framework 如何更改自动生成的;鉴别器;EntityFramework中的列?
我正在编写一些通过EF4.3使用单表继承的代码 有一个名为User的实体和另一个名为Admin的实体。管理员从用户继承 用户类Entity framework 如何更改自动生成的;鉴别器;EntityFramework中的列?,entity-framework,ef-code-first,Entity Framework,Ef Code First,我正在编写一些通过EF4.3使用单表继承的代码 有一个名为User的实体和另一个名为Admin的实体。管理员从用户继承 用户类 public class User { public int Id {get;set;} public string Username {get;set;} } public class Admin : User { } 管理类 public class User { public int Id {get;set;} public s
public class User
{
public int Id {get;set;}
public string Username {get;set;}
}
public class Admin : User { }
管理类
public class User
{
public int Id {get;set;}
public string Username {get;set;}
}
public class Admin : User { }
EF使用鉴别器
列生成数据库表。添加Admin
记录时,则Discriminator=“Admin”
和用户记录将具有Discriminator=“User”
我的问题是,如果我想让用户
进入和管理员
,如何更新鉴别器
列
我尝试从一种对象类型转换到另一种对象类型,并使用EF保存。但这不会改变鉴别器列。我如何改变它
感谢您的帮助。对象永远无法更改其类型。如果要更改用户的“管理员”设置(合理),应使用属性/属性,而不是类型名称 例如,您可以在
用户
对象和管理员
对象之间建立关联,而不希望将用户
对象替换为管理员
子类型
:
在设计一个好的对象关系映射时,你必须克服的一个心理障碍是,你倾向于主要用面向对象的术语或关系术语来思考,以适合你的个性为准。但是,一个好的对象关系映射同时包含一个好的对象模型和一个好的关系模型。例如,假设您有一个数据库,其中包含用于人员的表,以及用于员工和客户的相关表。一个人可能在所有三个表中都有一条记录。现在,从严格关系的角度来看,您可以为员工构建一个数据库视图,为客户构建另一个数据库视图,这两个视图都包含来自People表的信息。使用一个视图或另一个视图时,您可以暂时将个人视为“只是”员工或“只是”客户,即使您知道他们两者都是。因此,来自这个世界观的人可能会尝试进行OO映射,其中Employee和Customer都是Person的(直接)子类。但这与我们现有的数据不符;由于单个人员同时具有员工和客户记录(并且由于任何人员实例都不能同时属于具体的子类型employee和customer),因此人员和员工之间的OO关系需要是组合关系,而不是继承关系,对于人员和客户也是如此
要直接回答您的问题,使用EF无法更改此列。当然,您可以直接使用SQL来完成。但出于上述原因,我鼓励您更改此设计。这可能需要对我正在处理的应用程序进行深入重构。“对象永远无法更改其类型。”-但它们可以转换为其他类型。转换不会更改类型。它要么创建一个新实例(例如,使用显式转换),要么将引用视为更具体的类型。所有这些都不会改变鉴别器的值。@quakkels:这可能需要对我正在处理的应用程序进行一些深入的重构。不幸的是,如果您错误地理解应用程序的要求,并使用错误的设计,通常会发生这种情况。滥用继承是人们在应用程序中所能做的最糟糕的事情之一,因为在开发的后期修复此类设计错误总是很昂贵的。我想到的第一件事是用相同数据的新管理员替换现有用户:
user user=GetUser();Admin=Admin.FromUser(用户);dbContext.Users.Remove(用户);添加(admin)代码>。这样的事情是个坏主意,有什么原因吗?