在NHibernate中更改子类型

时间:2009-11-10 23:15:01

标签: nhibernate

我已经阅读了NHibernate - Changing sub-types,但我发现情况并不令人满意。

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

我尝试通过抓取之前保存的计划ID,使用新类型创建计划的新实例,设置ID和保存来尝试完成此工作。所有数据都按预期更新,当然除了鉴别器。

改变我的模型绝对是最后的手段。

此时,我正在考虑保存新条件(使用新ID)并更新对它的引用,然后删除旧条件。

有人有更好的主意吗?

3 个答案:

答案 0 :(得分:0)

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

<discriminator column="DiscriminatorColumnName" force="true" />

答案 1 :(得分:0)

由于您已经在弯曲NHibernate对象标识视图,为什么不使用一些自定义SQL在NHib之外更新它?

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

答案 2 :(得分:0)

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

  

编写面向对象的代码。

如果你的特定情况很难以面向对象的方式表达,那么你不应该在这种情况下使用NHibernate。

对于您的情况,您应该:

  • 创建一个派生Schedule的类的新实例,并允许它有一个新的ID
  • 从旧Schedule实例
  • 复制相关属性
  • Schedule中删除旧的Session实例,并确保相关的Job实例未引用它
  • 将新的Schedule实例添加到Session,并确保有问题的Job实例引用它

这将在数据库级别以deleteinsert而不是update结束。

这不是万不得已的。这应该是您的第一个度假胜地。这是从面向对象的角度来看的正确方法。