NHibernate升级到子类/从子类降级
我们正在使用表/子类映射映射以下域对象:NHibernate升级到子类/从子类降级,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我们正在使用表/子类映射映射以下域对象: class User { Id; FirstName; LastName; etc. } class Manager : User { // manager specific properties } 在UI中创建新的用户时,我们会检查管理者角色是否已被选中,如有必要,创建(并保存)一个管理者的实例,而不是用户 目标是尽可能简化将用户转换为经理的过程(只需选择一个角色) 当我试图通过删除管理器将管理器降级为用户
class User {
Id;
FirstName;
LastName;
etc.
}
class Manager : User {
// manager specific properties
}
在UI中创建新的用户
时,我们会检查管理者
角色是否已被选中,如有必要,创建(并保存)一个管理者
的实例,而不是用户
目标是尽可能简化将用户
转换为经理
的过程(只需选择一个角色)
当我试图通过删除管理器
将管理器
降级为用户
时,NHibernate会引发异常,因为它也试图删除用户
记录(对角色表有限制)
同样,我也不确定如何将用户“升级”到Manager
。因为我不能向上转换,所以我猜我需要创建一个新的管理器
实例,其身份与现有的用户
相同
我的Manager
子类映射如下所示:
public class ManagerMap : SubclassMap<Manager>
{
public ManagerMap()
{
Table("Managers");
KeyColumn("UserId");
Map(n => n.EmploymentType);
Map(n => n.PriorityLevel);
}
}
公共类管理器映射:子类映射
{
公共管理器映射()
{
表(“经理”);
KeyColumn(“UserId”);
地图(n=>n.EmploymentType);
Map(n=>n.PriorityLevel);
}
}
很抱歉,这是不可能的。几年前,我尝试做类似的事情,询问了一些人,看看他们是否知道,因为他们是NHibernate的重度用户。结论是这是不可能的
我或我认识的任何人能想到的唯一解决方案是使用直接SQL手动更新数据库中的鉴别器
假设用户只能是1种类型
i、 e经理、员工或实习生
我会给出一个用户列表,其中有一个下拉列表,允许更改用户类型。因此,这是一个独立于“编辑”用户的过程
这允许升级/降级用户。缺点是管理用户的过程分为两步 我认为在这里使用继承来让用户成为管理者是个坏主意。当用户扮演多个角色时,这将变得棘手。我会向User类添加一个可为null的ManagerBehaviour属性,最终可能会转移到在用户身上拥有一包行为对象。在我们的应用程序中,唯一具有任何额外行为的角色是
管理者
,尝试将这些行为概括为行为无疑会带来更多的复杂性。我认为,一个人的复杂性就是另一个人的简单性!在我看来,ManagerBehavious属性比公认的解决方案更简单。也许,基于我发布的简化示例。但是,由于Manager
与域中的其他对象有许多一对多和一对一的关联,因此很难将其转换为通用的东西。我同意@mcintyre321。无论ORM是什么,您都无法在运行时更改对象的类型,因此继承是对其建模的错误方法。用户和经理之间的一对一关系会更好地为您服务。您可以保持相同的表模式,而不破坏.NET OO规则。NHibernate将对象映射到关系数据库或从关系数据库映射对象。你能改变内存中对象的类型吗?否。因此,NHibernate对此没有任何规定。您可能还需要记住将数据库中不属于manager的任何列设置为null,并添加属于user的列,但这可能与您的用例无关。