2016-06-23 19 views
0

Я использую функциональность Fluent NHibernate для автоматизации/условных обозначений для привязки моих объектов к таблицам базы данных. У меня есть этот абстрактный класс, который каждый объект домена в моем приложении производный себя от:Автоматически генерировать Созданная дата в Fluent NHibernate Automapping

public abstract class Entity 
{ 
    public virtual int Id { get; protected internal set; } 
    public virtual DateTime Created { get; set; } 
} 

Как я могу изменить мой Fluent конфигурации, так что Created свойства имеет это значение автоматически устанавливается на значение DateTime.Now при сохранении записи в базе данных.

Вот мой Fluent конфигурация для справки:

private FluentNHibernate.Cfg.FluentConfiguration GetConfiguration() 
{ 

    return Fluently 
     .Configure() 
     .Database(() => 
      { 
       return MsSqlConfiguration.MsSql2012.ConnectionString(x => x.FromConnectionStringWithKey("main")); 
      }          
     ) 
     .Mappings(
      x => 
      { 
       var persistenceModel = new PersistenceModel() { ValidationEnabled = false }; 
       x.UsePersistenceModel(persistenceModel) 
       .AutoMappings.Add(
        AutoMap.AssemblyOf<Entity>().Where(Exceptions.Load) 
        .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()) 
        .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultCascade.SaveUpdate()) 
        .Conventions.Add(new FluentNHibernate.Conventions.Helpers.Builders.JoinConventionBuilder().Always(a => a.Fetch.Join())) 
       ); 
      } 
     ) 
     .ExposeConfiguration(BuildSchema); 
} 

ответ

1

вы должны использовать обработчик событий NHibernate для этого;

public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener 
{ 
    public bool OnPreUpdate(PreUpdateEvent @event) 
    { 
     var audit = @event.Entity as IHaveAuditInformation; 
     if (audit == null) 
      return false; 

     var time = DateTime.Now; 
     var name = WindowsIdentity.GetCurrent().Name; 

     Set(@event.Persister, @event.State, "UpdatedAt", time); 
     Set(@event.Persister, @event.State, "UpdatedBy", name); 

     audit.UpdatedAt = time; 
     audit.UpdatedBy = name; 

     return false; 
    } 

    public bool OnPreInsert(PreInsertEvent @event) 
    { 
     var audit = @event.Entity as IHaveAuditInformation; 
     if (audit == null) 
      return false; 


     var time = DateTime.Now; 
     var name = WindowsIdentity.GetCurrent().Name; 

     Set(@event.Persister, @event.State, "CreatedAt", time); 
     Set(@event.Persister, @event.State, "UpdatedAt", time); 
     Set(@event.Persister, @event.State, "CreatedBy", name); 
     Set(@event.Persister, @event.State, "UpdatedBy", name); 

     audit.CreatedAt = time; 
     audit.CreatedBy = name; 
     audit.UpdatedAt = time; 
     audit.UpdatedBy = name; 

     return false; 
    } 

    private void Set(IEntityPersister persister, object[] state, string propertyName, object value) 
    { 
     var index = Array.IndexOf(persister.PropertyNames, propertyName); 
     if (index == -1) 
      return; 
     state[index] = value; 
    } 
} 

https://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener

+0

Awesome, спасибо! – adaam

 Смежные вопросы

  • Нет связанных вопросов^_^