您应该注册一个监听器,前置插入和预更新事件。你可以像这样做,通过你的配置:
<hibernate-configuration>
...
<event type="pre-update">
<listener class="MyListener, MyAssembly"/>
</event>
<event type="pre-insert">
<listener class="MyListener, MyAssembly"/>
</event>
</hibernate-configuration>
,然后实现一个监听器 - 这样的事情(也许不完全准确 - 注销我的记忆):
public class MyListener : IPreUpdateEventListener, IPreInsertEventListener
{
public bool OnPreUpdate(PreUpdateEvent evt)
{
if (evt.Entity is IHasLastModified)
UpdateLastModified(evt.State, evt.Persister.PropertyNames);
return false;
}
public bool OnPreInsert(PreInsertEvent evt)
{
if (evt.Entity is IHasLastModified)
UpdateLastModified(evt.State, evt.Persister.PropertyNames);
return false;
}
void UpdateLastModified(object[] state, string[] names)
{
var index = Array.FindIndex(names, n => n == "LastModified");
state[index] = DateTime.Now;
}
}
,做同样的事前更新事件。
编辑:这一个负责插入以及更新和它似乎工作。
谢谢!真的很好的答案,帮了我很多。 此方法不会修改实体的属性,只会修改写入数据库的内容。但是同时设置实体的属性似乎没有问题。 – 2009-02-16 12:40:51
有关此确切问题的更完整解决方案,请参阅http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx – mookid8000 2009-04-29 14:42:14