2009-11-10 38 views
0

我已经阅读NHibernate - Changing sub-types,但我不觉得我的情况令人满意。在NHibernate中更改子类型

我的系统允许用户安排工作。可以使用不同类型的时间表标准(仅限一次,每日,每周,每月每月以及每月每月)设置时间表。其中每一个都有非常不同的数据和行为。对于用户来说,将时间表从一种标准类型更改为另一种标准类型是完全有效的。

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

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

在这一点上,我正在寻找保存新标准(使用新ID)并更新对其的引用,然后删除旧标准。

有人有更好的主意吗?

回答

0

您是否尝试过对矫正你的disciminator映射添加力=真像下面的hbm.xml元素

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

+0

嗯......我想尝试一下,但是在Fluent-NHibernate的鉴别器映射时遇到了问题 – Will 2009-11-11 02:23:27

0

既然你已经弯曲对象身份的NHibernate的观点,你为什么不只需使用一些自定义SQL在NHib之外更新它?

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

+0

出于好奇,你会如何建议更新模型? – Will 2009-11-20 01:59:43

+0

选择1:创建正确类型的新时间表对象,并将作业键入新时间表(即将获得新的PK值)。 选择2:创建一个“超级时间表”的对象,可以在任何或所有的每日,每周,每月等等上触发。 IOW没有DailySchedule类或WeeklySchedule类。改变一个时间表就变成了更新这个对象相关位的问题,而不是试图改变对象的类型。 – 2009-11-25 22:24:37

0

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

编写面向对象的代码。

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

对于你的情况,你应该:

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

这将结束,在数据库级别,作为deleteinsert,而不是一个update

这不是最后的手段。这应该是你的第一个度假村。从面向对象的角度来看,这是正确的做法。

+0

本质上讲,这是我在做什么: *创建新ScheduleCriteria从UI 填充它*识别旧ScheduleCriteria 的id *保存日程安排与它的新ScheduleCriteria *通过ID – Will 2009-11-20 01:58:07

+0

删除旧ScheduleCriteria由方式,是什么让你觉得这不是面向对象的?我能够对现有模型使用此方法,而无需进行任何更改。 练习的要点是尝试通过执行更新而不是删除+插入来更持久地保留对象。这里有什么相关的是我的对象和关系模型之间的映射;因此,ORM。 – Will 2009-11-20 02:00:14

+0

有了NHibernate,你不会坚持你的对象。使用NHibernate,你可以编写面向对象的代码,并且相当神奇地信任NHibernate来保持你的对象。这意味着你应该在C#语言的语义范围内工作。在C#中,您不能更改对象的类型。当使用NHibernate时,你不应该尝试改变一个对象的类型。 – yfeldblum 2009-11-20 13:50:01