2016-06-23 18 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; } 
} 

Createdプロパティは、レコードの保存時に自動的にDateTime.Nowの値に設定した値のしているように、どのように私は私の流暢設定を変更することができます。私は自分のアプリケーション内のすべてのドメインエンティティから自分自身を導出し、この抽象クラスを持っていますデータベースに格納されます。ここで

は、参考のために私の流暢な構成です:

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

素晴らしい、ありがとうございました! – adaam

関連する問題