2016-06-23 9 views
0

Fluent NHibernate의 automapping/convention 기능을 사용하여 엔티티를 데이터베이스 테이블에 매핑합니다. Created 속성이 레코드가 저장 될 때 자동으로 DateTime.Now의 값으로 설정 값입니다 가질 수 있도록 내 유창함 구성을 수정할 수있는 방법Fluent에서 작성 날짜를 자동으로 생성 NHibernate Automapping

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

: 나는 내 응용 프로그램의 모든 도메인 엔티티에서 자신을 파생이 추상 클래스가 데이터베이스에. 여기

는 참조 용으로 내 유창함 구성입니다 :

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