Entity framework 实体框架:继承,更改对象类型

Entity framework 实体框架:继承,更改对象类型,entity-framework,inheritance,Entity Framework,Inheritance,假设,我在模型中有两个类:User(映射到USERS表)和PrivilegedUser(继承User,其他信息存储在PrivilegedUser表中) 现在,我在USERS(和User的实例)中有一行,需要将该用户转换为PRIVILEGEDUSERS(即,在PRIVILEGEDUSERS中创建具有相同Id的记录)。有没有一种方法可以在不删除/插入的情况下执行此操作 问题是您在模型中没有PrivilegedUser表示,因此无法仅创建PrivilegedUser的该部分 这只是一个例子。Priv

假设,我在模型中有两个类:User(映射到USERS表)和PrivilegedUser(继承User,其他信息存储在PrivilegedUser表中)

现在,我在USERS(和User的实例)中有一行,需要将该用户转换为PRIVILEGEDUSERS(即,在PRIVILEGEDUSERS中创建具有相同Id的记录)。有没有一种方法可以在不删除/插入的情况下执行此操作

问题是您在模型中没有PrivilegedUser表示,因此无法仅创建PrivilegedUser的该部分



这只是一个例子。PrivilegedUser除了普通用户财产之外,还可以享受一些折扣或私人管理或其他优惠。同时,还有其他表需要引用用户,而不管具体的用户类型如何。我已经使用每类型表继承模式实现了它。在数据库级别,将用户从一种类型转换为另一种类型非常简单(只需从扩展表中插入或删除记录)。但在EF中,您只有存储User和PrivilegedUser对象的UserSet。这就是为什么我会问,是否可以用PrivilegedUser替换现有的用户对象,保留现有Id,而不删除用户表中的记录。

似乎有两个表代表用户是错误的

有一个Users表(针对所有用户)和一个UserPrivileges表(表示允许他们做什么)不是更好吗?这样,就不需要删除/插入,用户只需引用一个表

第三个表可用于表示实际权限

用户
Id用户名

用户权限
用户ID特权

特权
Id说明

不,您不能


如所述,EF(3.5)不支持此功能。您必须使用存储过程来完成此任务。

关于EF中的继承,请查看此网站,它解释了在EF中使用继承的三种不同方法


你需要改变你的世界观。您的观点是,您拥有具有标准权限的标准用户和具有附加权限的超级用户。特权不是枚举的,而是隐式的


新的世界视图是维护所有特权的列表,包括标准和超级特权,然后在映射表中创建一个多对多映射,其中用户拥有哪些特权。当用户被授予超级权限时,只需将相应权限的映射添加到映射表中。您不需要PrivilegedUser类,只需要User类中的特权列表。特权可以是标准的,也可以是超级的。

如前所述,您不能。通过存储过程或自定义插入/更新查询。我也遇到过类似的问题,现在我使用的是我在回答中描述的解决方案:

这是正确的。实例应该/永远不能更改类型。那么,当用户成为特权用户或非特权用户时会发生什么呢?@Craig,有什么消息吗?我遇到了同样的问题。@Shimmy,“新闻?”什么新闻?如果您认为您的对象需要更改类型,那么您可能误用了继承@丹丹的答案仍然是一个更好的主意。@Craig,我有一个Person表和一个Employee表(继承Person),我创建了一个人,6年后这个人成为了一名员工,有没有办法将员工记录附加到这个现有的人身上,这样他就可以获得Employee的附加功能?@Shimmy,而不是EF。您可以使用原始SQL来实现这一点,因为SQL不“知道”类继承。在我看来,最好的选择是采用一种模式,即员工与员工之间的关系是聚合关系而不是继承关系,这正是您所描述的原因。