2012-01-15 2 views
1

Я пытаюсь реализовать автоматический атрибут 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 не запускается по какой-либо причине. Есть идеи?

+0

Это пространство имен моего проекта Data. См. Этот пост для структуры моего проекта: http://stackoverflow.com/questions/8853519/how-should-i-organize-my-c-sharp-solution –

+0

Попробуйте разместить brakepoint в слушателе, останавливается ли он там ? – gdoron

+0

@ gdoron, нет, это не останавливается на достигнутом. В моем методе обновления, когда я запускаю '_session.SaveOrUpdate (entity) 'Я получаю это в своем журнале>' 2012-01-15 17: 34: 10,022 [TestRunnerThread] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - игнорирование постоянного экземпляра ' –

ответ

1

Похоже, что ваше имя сборки неверно. попробуйте следующее:

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

Это было спасибо, я изменил на' class = "MooDB.Data.CustomUpdateEventListener, Data" 'См. Мое редактирование для дальнейшей проблемы. –

+0

Я получил его сейчас, «тип» слушателя был неправильным. –

+0

@MarkAllison, В чем проблема «типа» и какого типа ...? – gdoron