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