NHibernate:插入额外的计算列

时间:2010-05-12 07:01:50

标签: nhibernate

您对NHibernate采取以下措施的方法是什么:
Comment插入到DB中,并将其属性Text插入到列Text中时(由于映射),请在列TextHash中插入此属性值的哈希值。

如果我映射TextHash,这似乎微不足道,但如果不映射它我该如何做呢? 我在域模型中不需要它,它是一个DB级优化(如果不是长度限制,我会使用计算的HashBytes)。

3 个答案:

答案 0 :(得分:1)

有一些类似的问题,比如这一个:
Unmapped Columns in NHibernate?

然而,IInterceptor似乎对单个实体插入中的更改有些过分。并且EventListeners不完全记录,对于单个列而言也有点过于复杂。

所以我已经决定了解决方案,我认为这两种解决方案都是最可重用的和最本地的:

  <property name="Text" type="StringWithMD5HashUserType">
    <column name="Text" length="20000" not-null="true" />
    <column name="TextHash" length="32" not-null="true" />
  </property>

其中StringWithMD5HashUserType ICompositeUserType从第一列读取Text,但同时写入Text及其Hash(我不添加{的代码{1}}因为它太长了,但基本上非常简单。)

答案 1 :(得分:0)

好吧,如果您不想使用该属性,请将其声明为private并在设置text属性时进行计算。它并不完全是“没有映射它”,但是当你使用该类时你不会看到它(免责声明:基于Hibernate的建议,而不是NHibernate)。

除此之外,你总是可以写一个触发器,虽然我个人更喜欢添加一个私有字段并完成它。

答案 2 :(得分:0)

这是一个建议: 据我所知,如果没有为它定义映射,则无法使用NHibernate访问数据库中的列。 为了防止应用程序的其他部分看到您的类的这个字段,您可以在映射中将其访问权限定义为字段,以便它可以是私有的,没有人知道它存在但是NHibernate: 在你的班上:

private string _textHash

在您的地图中:

<property name='_textHash' column='TextHash' access='field' />