处理Nhibernate子类不存在的情况

时间:2013-07-02 11:02:29

标签: nhibernate fluent-nhibernate-mapping

我有一个场景,我使用nhibernate将记录从一个表映射到基于鉴别器的几个不同的派生类。

public class BaseClass { }

public class DerivedClass0 : BaseClass { }
public class DerivedClass1 : BaseClass { }
public class DerivedClass2 : BaseClass { }

然后我使用nhibernate的DiscriminateSubClassesOnColumn()方法并改变配置以包含

<subclass name="DerivedClass0" extends="BaseClass" discriminator-value="discriminator0" />
<subclass name="DerivedClass1" extends="BaseClass" discriminator-value="discriminator1" />
<subclass name="DerivedClass2" extends="BaseClass" discriminator-value="discriminator2" />

因此,在映射时,这些类将强制转换为派生类而不是BaseClass。

但是,我的数据库中有一些记录有一个没有相应子类的鉴别器。在这些情况下,nHibernate会抛出错误:

"Object with id: 'xxx' was not of the specified subclass..."

有没有办法可以处理这个问题,以便任何没有相应子类的记录都被转换为BaseClass而不是抛出错误?

我已尽可能地简化了上述内容,但值得注意的是动态编辑XML,这就是为什么我同时引用流畅的nhibernate [DiscriminateSubClassesOnColumn()]和XML。

以下事情(有帮助)不是一种选择:

  • 我无法更正数据以删除无效的记录
  • 我无法为那些没有
  • 的记录创建子类

我需要处理nHibernate试图在鉴别器上映射并发现一个不存在的情况。

1 个答案:

答案 0 :(得分:0)

解决方案是在Fluent NHibernate映射中使用“AlwaysSelectWithValue()”方法。

DiscriminateSubClassesOnColumn("discriminator").AlwaysSelectWithValue();

这会强制NHIbernate仅从具有相应子类的数据库中获取结果。