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的列,但这可能与您的用例无关。