5

我正在编写一些通过 EF4.3 使用单表继承的代码。

有一个名为 User 的实体和另一个名为 Admin 的实体。管理员继承自用户。

用户类

public class User
{
    public int Id {get;set;}
    public string Username {get;set;}
}

管理类

public class Admin : User { }

EF 生成带有Discriminator列的数据库表。当Admin添加记录时Discriminator="Admin",用户记录将具有Discriminator="User".

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

我尝试从一种对象类型转换为另一种对象类型并使用 EF 保存。但这不会改变鉴别器列。我该如何改变它?

谢谢你的帮助。

4

1 回答 1

7

对象永远不能改变它们的类型。如果您打算更改用户的“管理员”设置(合理),您应该使用属性/属性而不是类型名称来执行此操作。

例如,您可以在User对象和Administrator对象之间建立关联,而不是希望将对象替换为子类型。UserAdministrator

我在一篇旧博客文章中写过这个想法

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

要直接回答您的问题,无法使用 EF 更改此列。你当然可以直接用 SQL 来做。但是由于上述原因,我鼓励您更改此设计。

于 2012-05-23T21:37:13.820 回答