【问题标题】:How to implement LastUpdate in NHibernate Entities?如何在 NHibernate 实体中实现 LastUpdate?
【发布时间】:2012-02-10 21:06:27
【问题描述】:

我正在尝试为我的 NHibernate 实体实现自动 LastUpdate 属性。我考虑过使用数据库触发器,然后认为在 NHibernate 中做得更好。我以blog post 为指导。

我的域实体是:

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)] - 无法执行命令:更新工具 SET 版本 = @p0,符号 = @p1,[名称] = @p2,isActive = @p3,created = @p4,lastUpdated = @p5 WHERE instrumentId = @p6 AND version = @p7 System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

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

【问题讨论】:

  • 这是我的数据项目的命名空间。请参阅这篇文章了解我的项目结构:stackoverflow.com/questions/8853519/…
  • 尝试在监听器中放置一个刹车点,它会停在那里吗?
  • @gdoron,不,它不止于此。在我的更新方法中,当我运行 _session.SaveOrUpdate(entity) 时,我在日志中得到了这个> 2012-01-15 17:34:10,022 [TestRunnerThread] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - ignoring persistent instance
  • 在我的日志的下一行,我得到2012-01-15 17:34:10,022 [TestRunnerThread] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - object already associated with session: [MooDB.Domain.Instrument#1] 当我打电话给.Flush() 时我得到了我的错误

标签: c# nhibernate


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我改成class="MooDB.Data.CustomUpdateEventListener, Data" 请查看我的编辑以了解更多问题。
  • @MarkAllison,type 有什么问题,什么类型...?
  • 我有 type="update",我在 hibernate.cfg.xml 中将其更改为 type="save-update"。但是现在我遇到了Save 的问题...
  • 我这里有一个后续问题stackoverflow.com/questions/8872542/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多