我们使用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);
}
}
答案 0 :(得分:2)
很抱歉,这是不可能的。几年前我尝试做类似的事情,并询问了一些人,看看他们是否知道,他们是沉重的NHibernate用户。结论是不可能的。
我或我所知道的唯一解决方案是使用直接SQL手动更新数据库中的鉴别器。
假设用户只能是1种类型。
即经理,员工或实习生。
我会给出一个用户列表,其中包含一个允许更改用户类型的下拉列表。所以这是一个与“编辑”用户分开的过程。
这允许升级/降级用户。这使得它成为管理用户的两步过程的缺点。
答案 1 :(得分:1)
我认为在这里使用继承来使用户成为管理员是个坏主意。当用户履行多个角色时,它会变得棘手。我会将一个可以为空的ManagerBehaviour属性添加到User类中,最终可能会转移到用户上有一袋Behavior对象。