Как реализовать LastUpdate в сущностях NHibernate? - PullRequest
1 голос
/ 15 января 2012

Я пытаюсь реализовать автоматический атрибут LastUpdate для моих сущностей NHibernate. Я подумал об использовании триггеров базы данных, а затем подумал, что лучше сделать это в 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>

Мое решение работает нормально, но я получаю FileNotFoundException, когда NHibernate пытается найти список. Мои ссылки настроены правильно, и у меня есть правильные 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 instruments SET version = @ p0, symbol = @ p1, [name] = @ p2, isActive = @ p3, созданный = @ p4, lastUpdated = @ p5 WHERE instrumentId = @ p6 AND version = @ p7 System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.12.9999 11:59:59 вечера.

Похоже, код entity.UpdateDate = DateTime.Now; в ProcessEntityBeforeUpdate по какой-то причине не запускается. Есть идеи?

1 Ответ

1 голос
/ 15 января 2012

Похоже, ваша сборка неверна. попробуйте это:

<listener class="MooDB.Data.CustomUpdateEventListener, MooDB" type="update" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...