您对NHibernate采取以下措施的方法是什么:
将Comment
插入到DB中,并将其属性Text
插入到列Text
中时(由于映射),请在列TextHash
中插入此属性值的哈希值。
如果我映射TextHash
,这似乎微不足道,但如果不映射它我该如何做呢?
我在域模型中不需要它,它是一个DB级优化(如果不是长度限制,我会使用计算的HashBytes)。
答案 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' />