2012-01-15 82 views
1

我正在试图为我的NHibernate实体实现一个自动LastUpdate属性。我想过使用数据库触发器,然后认为它在NHibernate中做得更好。我正在关注这个blog post作为指导。如何在NHibernate实体中实现LastUpdate?

我的域实体是:

public class Instrument : Entity, IAuditableEntity 
{ 
    public virtual string Name { get; set; } 
    public virtual string Symbol {get; set;} 
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; } 
    public virtual bool IsActive { get; set; }   
} 

public abstract class Entity 
{ 
    public virtual int Id { get; set; } 
    public virtual int Version {get; private set;} 
    public virtual DateTime CreateDate { get; private set; } 
    public virtual DateTime UpdateDate { get; set; } 
} 

继承和这里的接口:

public interface IAuditableEntity 
{ 
    DateTime UpdateDate { get; set; } 
} 

我的监听器类:

public class CustomUpdateEventListener : DefaultSaveEventListener 
{ 
    protected override object PerformSaveOrUpdate(SaveOrUpdateEvent evt) 
    { 
     var entity = evt.Entity as IAuditableEntity; 
     if (entity != null) 
     { 
      ProcessEntityBeforeUpdate(entity); 
     } 
     return base.PerformSaveOrUpdate(evt); 
    } 

    internal virtual void ProcessEntityBeforeUpdate(IAuditableEntity entity) 
    { 
     entity.UpdateDate = DateTime.Now; 
    } 
} 

和我的域实体Instrument映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MooDB" namespace="MooDB" > 
    <class name="MooDB.Domain.Instrument,MooDB" table="instruments"> 
    <id name="Id" column="instrumentId" unsaved-value="0"> 
     <generator class="increment"></generator> 
    </id> 
    <version name="Version" column="version" type="integer" unsaved-value="0"/> 
    <property name="Symbol" column="symbol" type="string" length="10" not-null="false"/> 
    <property name="Name" column="`name`" type="string" length="30" not-null="false"/> 
    <property name="IsActive" column="isActive" type="bool" not-null="true" /> 
    <set name="BrokerInstruments" table="brokerInstruments" generic="true" inverse="true"> 
     <key column="instrumentId" /> 
     <one-to-many class="MooDB.Domain.BrokerInstrument"/> 
    </set> 
    <property name="CreateDate" column="created" not-null="false" /> 
    <property name="UpdateDate" column="lastUpdated" /> 
    </class> 
</hibernate-mapping> 

我的hibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
    <session-factory> 
    ... connection details snipped 
    <mapping assembly="MooDB"/> 
    <listener class="MooDB.Data.CustomUpdateEventListener, MooDB.Data" type="update" /> 
    </session-factory> 
</hibernate-configuration> 

我的解决方案建立很好,但我得到一个FileNotFoundException当NHibernate的尝试查找听者。我的参考设置正确,我有正确的using声明,所以我不知道为什么NHibernate找不到它。下面是来自日志中的错误:

2012-01-15 15:26:12911 [TestRunnerThread] ERROR NHibernate.Util.ReflectHelper [(空)] - 未能加载类型 MooDB.Data.CustomUpdateEventListener, MooDB.Data。 System.IO.FileNotFoundException:无法加载文件或程序集 'MooDB.Data'或其依赖项之一。系统找不到指定的 文件。文件名:'MooDB.Data'

你知道什么可能是错的吗?

编辑:现在我就在下面SqlTypeException

2012-01-15 17:06:37302 [TestRunnerThread]错误NHibernate.AdoNet.AbstractBatcher [(NULL)] - 无法执行命令:更新工具SET版本= @ p0,symbol = @ p1,[name] = @ p2,isActive = @ p3,created = @ p4,lastUpdated = @ p5 WHERE instrumentId = @ p6 AND version = @ p7 System.Data.SqlTypes .SqlTypeException:SqlDateTime溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。

看来代码entity.UpdateDate = DateTime.Now;ProcessEntityBeforeUpdate由于某种原因没有运行。有任何想法吗?

+0

这是我的数据项目的命名空间。看到这个职位的我的项目的结构:http://stackoverflow.com/questions/8853519/how-should-i-organize-my-c-sharp-solution – 2012-01-15 16:39:38

+0

尝试将一个刹车点放在侦听器中,它在那里停止? – gdoron 2012-01-15 17:21:04

+0

@gdoron,不,它并不止于此。在我的Update方法中,当我运行'_session。SaveOrUpdate(实体)'我得到这在我的日志>'2012-01-15 17:34:10,022 [TestRunnerThread] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(空)] - 忽略持久实例 ' – 2012-01-15 17:35:40

回答

1

看起来你的程序集名称是错误的。试试这个:

<listener class="MooDB.Data.CustomUpdateEventListener, MooDB" type="update" /> 
+0

这就是它,谢谢,我改成了'class =“MooDB.Data.CustomUpdateEventListener,Data”'请参阅我的编辑的进一步问题。 – 2012-01-15 17:08:03

+0

我现在正在工作,听者的'类型'是错误的。 – 2012-01-15 18:00:16

+0

@MarkAllison,“type”和什么类型的问题是什么? – gdoron 2012-01-15 18:13:05