【问题标题】:Entity Framework: Inheritance, change object type实体框架:继承,改变对象类型
【发布时间】:2009-08-06 15:04:13
【问题描述】:

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

现在,我在 USERS(和 User 的实例)中有一行,需要将该用户转换为 PrivilegedUser(即在 PRIVILEGEDUSERS 中创建具有相同 ID 的记录)。没有删除/插入有没有办法做到这一点?

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


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

【问题讨论】:

    标签: entity-framework inheritance


    【解决方案1】:

    不,你不能。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        有一个 Users 表(适用于所有用户)然后是一个 UserPrivileges 表,代表他们被允许做什么不是更好吗?这样,不需要删除/插入,您可以只为用户引用一个表。

        第三个表可以用来表示实际的权限。

        用户
        ID 用户名 ...

        用户权限
        UserId PrivilegeId

        特权
        标识说明

        【讨论】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-02
            • 2017-09-04
            • 2011-05-19
            • 2010-10-07
            • 1970-01-01
            相关资源
            最近更新 更多