更改NHibernate中的子类型

更改NHibernate中的子类型,nhibernate,Nhibernate,我已经读过了,但我觉得这并不符合我的情况 我的系统允许用户安排作业。可以使用不同类型的计划标准(仅一次、每日、每周、每月逐日和每月逐周)设置计划。每一个都有非常不同的数据和行为。用户完全可以将计划从一种标准类型更改为另一种标准类型 我试图通过抓取以前保存的计划id、使用新类型创建计划的新实例、设置id并保存来实现这一点。除鉴别器外,所有数据均按预期更新 改变我的模式绝对是万不得已的办法 此时,我正在考虑保存新标准(使用新id)并更新对它的引用,然后删除旧标准 有人有更好的主意吗?您是否尝试过修改

我已经读过了,但我觉得这并不符合我的情况

我的系统允许用户安排作业。可以使用不同类型的计划标准(仅一次、每日、每周、每月逐日和每月逐周)设置计划。每一个都有非常不同的数据和行为。用户完全可以将计划从一种标准类型更改为另一种标准类型

我试图通过抓取以前保存的计划id、使用新类型创建计划的新实例、设置id并保存来实现这一点。除鉴别器外,所有数据均按预期更新

改变我的模式绝对是万不得已的办法

此时,我正在考虑保存新标准(使用新id)并更新对它的引用,然后删除旧标准


有人有更好的主意吗?

您是否尝试过修改disciminator映射以添加force=true,如下面的hbm.xml元素


既然已经弯曲了对象标识的NHibernate视图,为什么不使用一些自定义SQL在NHib之外对其进行更新呢


我的首选解决方案是更新我的模型,但您已经说过这是您的最后选择。

如果您想使用NHibernate,那么您必须做出的让步是:

编写面向对象的代码

如果您的特定案例很难用面向对象的方式表达,那么您不应该在该案例中使用NHibernate

就您的情况而言,您应该:

  • 创建派生
    计划的类的新实例,并允许其具有新的
    ID
  • 从旧的
    计划
    实例复制相关属性
  • 会话
    中删除旧的
    计划
    实例,并确保相关的
    作业
    实例未引用它
  • 将新的
    计划
    实例添加到
    会话
    ,并确保相关的
    作业
    实例引用它
这将在数据库级别结束为
删除
插入
,而不是
更新


这不是最后的办法。这应该是你的第一个选择。从面向对象的角度来看,这是正确的方法。

Hmm。。。我想尝试一下,但在Fluent NHibernate中的鉴别器映射方面遇到了问题本质上这就是我正在做的:*创建新的ScheduleCriteria并从UI中填充它*标识旧ScheduleCriteria的id*使用新的ScheduleCriteria保存计划*通过IDB删除旧的ScheduleCriteria,是什么让你认为这不是面向对象的?我能够在不做任何更改的情况下对现有模型使用此方法。本练习的目的是通过执行更新而不是删除+插入,使持久化对象更加方便。与此相关的是我的对象和关系模型之间的映射;因此,使用NHibernate,您不会持久化您的对象。使用NHibernate,您可以编写面向对象的代码,并神奇地相信NHibernate能够适当地持久化您的对象。这意味着您应该在语言C的语义范围内工作。在C#中,不能更改对象的类型。使用NHibernate时,不应尝试更改对象的类型。选项1:创建正确类型的新计划对象,并将作业键入新计划(即,它将获得新的PK值)。选择2:创建一个“超级日程”对象,它可以在任何或所有每日、每周、每月等时间触发。没有DailySchedule类或WeeklySchedule类。然后,更改计划就变成了更新此对象上的相关位的问题,而不是试图更改对象的类型。