NHibernate从子类升级到/ downgrade

时间:2013-07-16 09:18:52

标签: nhibernate fluent-nhibernate

我们使用Table-per-subclass映射映射以下域对象:

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

class Manager : User {
    // manager specific properties
}

在UI中创建新的User时,我们会检查是否已选择Manager角色,并在必要时创建(并保存)Manager的实例,而不是{ {1}}。

目标是尽可能简单地将User转换为User /从Manager转换(仅通过选择角色)。

当我尝试通过删除Manager NHibernate将User降级为Manager时抛出异常,因为它也试图删除User记录(其中对Roles表有约束。)

同样,我不确定如何将用户“升级”为Manager。由于我无法提升,我猜我需要创建一个与现有Manager具有相同标识的新User实例?

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

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

2 个答案:

答案 0 :(得分:2)

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

我或我所知道的唯一解决方案是使用直接SQL手动更新数据库中的鉴别器。

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

即经理,员工或实习生。

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

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

答案 1 :(得分:1)

我认为在这里使用继承来使用户成为管理员是个坏主意。当用户履行多个角色时,它会变得棘手。我会将一个可以为空的ManagerBehaviour属性添加到User类中,最终可能会转移到用户上有一袋Behavior对象。