1

我们使用每个子类的表映射来映射以下域对象:

class User {
    Id;
    FirstName;
    LastName;
    etc.
}

class Manager : User {
    // manager specific properties
}

User在 UI 中创建新角色时,我们会检查Manager角色是否已被选中,如有必要,请创建(并保存)一个Manager而不是User.

目标是使将 a 转换为 aUser或从 a转换的过程Manager尽可能简单(只需选择一个角色)。

当我尝试通过删除NHibernate 将 a 降级Manager为 a 时,会引发异常,因为它 也在尝试删除记录(对 Roles 表有约束)。UserManagerUser

同样,我不确定如何将用户“升级”到Manager. 由于我不能向上转换,我猜我需要创建一个Manager与现有实例具有相同身份的新实例User

我的子类映射Manager如下所示:

public class ManagerMap : SubclassMap<Manager>
{
    public ManagerMap()
    {
        Table("Managers");
        KeyColumn("UserId");
        Map(n => n.EmploymentType);
        Map(n => n.PriorityLevel);
    }
}
4

2 回答 2

2

很抱歉,这是不可能的。几年前,我尝试做类似的事情,并询问了一些人是否知道,他们是 NHibernate 的重度用户。结论是这是不可能的。

我或我认识的任何人能想出的唯一解决方案是使用直接 SQL 手动更新数据库中的鉴别器。

假设用户只能是一种类型。

即经理、员工或实习生。

我会给出一个用户列表,其中包含一个允许更改用户类型的下拉菜单。所以这是一个与“编辑”用户不同的过程。

这允许升级/降级用户。缺点是使其成为管理用户的两步过程。

于 2013-07-16T09:30:14.460 回答
1

我认为在这里使用继承来使用户成为经理是一个坏主意。当用户扮演多个角色时,它会变得很棘手。我会在 User 类中添加一个可为空的 ManagerBehaviour 属性,最终可能会转向在用户身上拥有一袋 Behavior 对象。

于 2013-07-16T09:51:59.603 回答