Я пытаюсь реализовать автоматический атрибут LastUpdate для своих объектов NHibernate. Я думал об использовании триггеров базы данных, а затем подумал, что это лучше сделано в NHibernate. Я следую этому blog post в качестве руководства.Как реализовать 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>
Мое решение строит хорошо, но я получаю FileNotFoundException
когда NHibernate пытается найти у слушателя. Мои ссылки настроены правильно, и у меня есть правильные using
заявления, поэтому я не уверен, почему NHibernate не может его найти. Вот ошибка из журнала:
2012-01-15 15: 26: 12911 [TestRunnerThread] ОШИБКА NHibernate.Util.ReflectHelper [(нулевое)] - Не удалось загрузить тип MooDB.Data.CustomUpdateEventListener, MooDB.Data. System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'MooDB.Data' или одну из его зависимостей. Система не может найти указанный файл . Имя файла: 'MooDB.Data'
Вы знаете, что может быть неправильным?
Edit: Сейчас я получаю следующее SqlTypeException
:
2012-01-15 17: 06: 37302 [TestRunnerThread] ERROR NHibernate.AdoNet.AbstractBatcher [(нулевое)] - Не удалось выполнить команду : Инструменты UPDATE SET version = @ p0, symbol = @ p1, [name] = @ p2, isActive = @ p3, created = @ p4, lastUpdated = @ p5 WHERE instrumentId = @ p6 И 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
не запускается по какой-либо причине. Есть идеи?
Это пространство имен моего проекта Data. См. Этот пост для структуры моего проекта: http://stackoverflow.com/questions/8853519/how-should-i-organize-my-c-sharp-solution –
Попробуйте разместить brakepoint в слушателе, останавливается ли он там ? – gdoron
@ gdoron, нет, это не останавливается на достигнутом. В моем методе обновления, когда я запускаю '_session.SaveOrUpdate (entity) 'Я получаю это в своем журнале>' 2012-01-15 17: 34: 10,022 [TestRunnerThread] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - игнорирование постоянного экземпляра ' –