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

时间:2009-08-06 15:04:14

标签: entity-framework inheritance

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

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

问题是您在模型中没有PRIVILEGEDUSERS表示,因此您不能仅创建PrivilegedUser的那部分。


这只是一个例子。 PrivilegedUser可能有一些折扣或个人经理或其他 <普通用户属性。同时,无论具体的用户类型如何,还有其他表需要引用用户。我已经使用Table-per-Type继承模式实现了它。在数据库级别,将用户从一种类型转换为另一种类型非常简单(您只需要从扩展表中插入或删除记录)。但在EF中,您只有UserSet,它存储User和PrivilegedUser对象。这就是我要问的是,可以用PrivilegedUser替换现有的用户对象,保留现有的Id而不删除USERS表中的记录。

5 个答案:

答案 0 :(得分:3)

不,你不能。

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

答案 1 :(得分:1)

您需要更改世界视图。您的观点是您拥有标准权限的标准用户和具有其他权限的超级用户。这些特权不是枚举的,而是隐含的。

新的世界观是您维护所有权限(标准和超级)的列表,然后在映射表中创建多个用户具有哪些权限的多个地图。当用户被授予超级权限时,您只需为映射表添加适当权限的映射。您不需要PrivilegedUser类,只需要User类中的权限列表。权限可以是标准权限,也可以是超级权限。

答案 2 :(得分:0)

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

拥有一个Users表(对于所有用户)然后是UserPrivileges表,表示允许他们做什么不是更好吗?这样,不需要删除/插入,并且您只能为用户引用一个表。

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

用户
Id用户名...

UserPrivileges
UserId PrivilegeId

权限
Id说明

答案 3 :(得分:0)

关于EF中的继承,请看一下这个站点,它解释了在EF中使用继承的三种不同方法。

http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/20/entity-framework-inheritance-types.aspx

答案 4 :(得分:0)

如上所述,你不能。通过存储过程或通过自定义插入/更新查询。我有类似的问题,现在我正在使用我在这个答案中描述的解决方案:https://stackoverflow.com/a/28380804/2424989