NHibernate:插入其他计算列

NHibernate:插入其他计算列,nhibernate,Nhibernate,您与NHibernate的合作方式是什么: 当注释插入到数据库中,并且其属性文本插入到列文本(由于映射),则在列文本哈希中插入此属性值的哈希 如果我映射TextHash,这看起来很简单,但是如果不映射它,我应该怎么做呢? 我在域模型中不需要它,它是一个DB级优化(如果不是长度限制,我将使用计算的HashBytes)。如果您不想使用该属性,请将其声明为private,并在设置text属性时计算它。它并不完全是“没有映射的”,但当您使用该类时,您将看不到它(免责声明:基于Hibernate的建议,与

您与NHibernate的合作方式是什么:
注释
插入到数据库中,并且其属性
文本
插入到列
文本
(由于映射),则在列
文本哈希
中插入此属性值的哈希

如果我映射
TextHash
,这看起来很简单,但是如果不映射它,我应该怎么做呢?

我在域模型中不需要它,它是一个DB级优化(如果不是长度限制,我将使用计算的HashBytes)。

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


除此之外,您可以随时编写触发器,尽管我个人更愿意添加一个私有字段并使用它。

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

除此之外,您可以随时编写触发器,尽管我个人更愿意添加一个私有字段并使用它。

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

private string _textHash
在映射中:

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

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

private string _textHash
在映射中:

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

有一些类似的问题,比如这个:

然而,
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
(我不添加
StringWithMD5HashUserType
的代码,因为它太长了,但本质上非常简单)有一些类似的问题,比如这个:

然而,
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
(我不添加
StringWithMD5HashUserType
的代码,因为它太长了,但本质上非常简单)。

我知道我可以使用私有代码,但这并不完全是无知。所以这有点违背了我所看到的NH的优势。恐怕我看不到宣布一个私有领域的负面影响。从语义上讲,这样说,您基本上是说它是一个“本地实现细节”,它“不能从实体外部使用”,而应用程序的其余部分仍然对计算字段一无所知。您需要将散列逻辑放在某个地方,我只能想到两个地方:模型和数据库。不管怎样,请不要介意。:)我看到了第三个位置,例如IUserType或IInterceptor,它没有将散列算法直接绑定到实体。我只是不知道NHibernate的什么扩展点适用于我的用例。当假设hibernate和NHibernate是孪生实现时,我似乎过于泛化了。我很想知道这个问题会得出什么样的结论。我用我最终使用的方法来回答。我知道我可以用私人的方法,但这并不是完全的。所以这有点违背了我所看到的NH的优势。恐怕我看不到宣布一个私有领域的负面影响。从语义上讲,这样说,您基本上是说它是一个“本地实现细节”,它“不能从实体外部使用”,而应用程序的其余部分仍然对计算字段一无所知。您需要将散列逻辑放在某个地方,我只能想到两个地方:模型和数据库。不管怎样,请不要介意。:)我看到了第三个位置,例如IUserType或IInterceptor,它没有将散列算法直接绑定到实体。我只是不知道NHibernate的什么扩展点适用于我的用例。当假设hibernate和NHibernate是孪生实现时,我似乎过于泛化了。我很想听听这个问题会得出什么样的结论。我用我最终使用的方法回答了这个问题。好吧,这和托米斯拉夫所建议的几乎是一样的。它也有同样的问题:将实体绑定到哈希算法(实际上是一个实现细节),将实体绑定到数据库结构。另外,一个没有人使用的私有字段很有可能被使用Resharper的开发人员删除