如何在NHibernate实体中实现LastUpdate? [英] How to implement LastUpdate in NHibernate Entities?

查看:68
本文介绍了如何在NHibernate实体中实现LastUpdate?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的NHibernate实体实现自动的LastUpdate属性.我考虑过使用数据库触发器,然后认为最好在NHibernate中完成.我正在按照博客文章进行指导.

我的域实体是:

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>

我的解决方案构建良好,但是当NHibernate尝试查找列表器时,出现了FileNotFoundException的提示.我的引用设置正确,并且我有正确的using语句,因此我不确定NHibernate为什么找不到它.这是日志中的错误:

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

你知道怎么了吗?

编辑:我现在得到以下SqlTypeException:

2012-01-15 17:06:37,302 [TestRunnerThread]错误NHibernate.AdoNet.AbstractBatcher [(null)]-无法执行命令:UPDATE文书SET版本= @ p0,符号= @ p1,[名称] = @ p2,isActive = @ p3,创建= @ p4,lastUpdated = @ p5 WHERE instrumentId = @ p6 AND版本= @ p7 System.Data.SqlTypes.SqlTypeException:SqlDateTime溢出.必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间.

由于某些原因,似乎未运行ProcessEntityBeforeUpdate中的代码entity.UpdateDate = DateTime.Now;.有什么想法吗?

解决方案

您的程序集名称似乎错误.试试这个:

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

I'm attempting to implement an automatic LastUpdate attribute to my NHibernate entities. I thought about using database triggers and then thought it better done in NHibernate. I am following this blog post as a guide.

My domain entity is:

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; }        
}

which inherits from

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; }
}

and here's the interface:

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

My listener class:

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;
    }
}

and my domain entity Instrument mapping file:

<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>

My 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>

My solution builds fine but I am getting a FileNotFoundException when NHibernate tries to find the listner. My references are set up correctly and I have the right using statements, so I'm not sure why NHibernate can't find it. Here's the error from the log:

2012-01-15 15:26:12,911 [TestRunnerThread] ERROR NHibernate.Util.ReflectHelper [(null)] - Could not load type MooDB.Data.CustomUpdateEventListener, MooDB.Data. System.IO.FileNotFoundException: Could not load file or assembly 'MooDB.Data' or one of its dependencies. The system cannot find the file specified. File name: 'MooDB.Data'

Do you know what could be wrong?

Edit: I'm now getting the following SqlTypeException:

2012-01-15 17:06:37,302 [TestRunnerThread] ERROR NHibernate.AdoNet.AbstractBatcher [(null)] - Could not execute command: UPDATE instruments SET version = @p0, symbol = @p1, [name] = @p2, isActive = @p3, created = @p4, lastUpdated = @p5 WHERE instrumentId = @p6 AND version = @p7 System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

It seems that the code entity.UpdateDate = DateTime.Now; in ProcessEntityBeforeUpdate is not being run for some reason. Any ideas?

解决方案

It's looks like your's assembly name is wrong. try this:

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

这篇关于如何在NHibernate实体中实现LastUpdate?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆