2010-07-02 5 views
5

다음 코드는 삽입시 작동하지만 업데이트 modifier이 설정되지 않은 이유는 무엇입니까?업데이트시 이벤트가있는 nhibernate 감사

사전 업데이트 코드가 실행 중이고 상태 값과 엔터티 값이 원하는 값으로 올바르게 설정되어 있습니다. 그러나 생성 된 SQL nhibernate를 볼 때 업데이트 쿼리의 필드는 포함되지 않습니다.

/// <summary> Updates auditable objects </summary> 
public class AuditEventListener : IPreInsertEventListener, IPreUpdateEventListener 
{ 
    private ISecurityManager securityManager; 

    public bool OnPreInsert(PreInsertEvent args) 
    { 
     var auditable = args.Entity as IAuditable; 
     if (auditable != null) { 

      Set(x => auditable.Creator, args.Persister, auditable, args.State, SecurityManager.Identity); 
      Set(x => auditable.DateAdded, args.Persister, auditable, args.State, Clock.Now); 
     } 
     return false; 
    } 

    public bool OnPreUpdate(PreUpdateEvent args) 
    { 
     var auditable = args.Entity as IAuditable; 
     if (auditable != null) { 

      Set(x => auditable.Modifier, args.Persister, auditable, args.State, SecurityManager.Identity); 
      //Set(x => auditable.DateModified, args.Persister, auditable, args.State, Clock.Now); 
     } 
     return false; 
    } 


    /// <summary> Type safe method to update sate and entity </summary> 
    private void Set<T, U>(Expression<Func<U, T>> expression, IEntityPersister persister, U instance, object[] state, T value) 
    { 
     var member = expression.Body as MemberExpression; 
     if (member != null) { 

      var index = Array.IndexOf(persister.PropertyNames, member.Member.Name); 
      if (index == -1) { 
       return; 
      } 
      state[index] = value; 

      var property = (member.Member as PropertyInfo); 
      if (property != null) { 
       property.SetValue(instance, value, null); 
      } 
     } 
    } 

    ISecurityManager SecurityManager 
    { 
     get { /* From IoC */ } 
    } 

} 
+0

이 코드는 Set 메서드가 비정상적이지만 잘 보입니다. OnPreUpdate에 중단 점을 넣으면 업데이트 된 객체를 유지할 때 호출되는 중입니까? –

+0

네, 문제는 그 속성이 nhibernate에 의해 더럽다고 간주되지 않는 것과 관련이 있다고 생각합니다. –

답변

3

편집 1 :이 대답은
편집이 개선되었습니다 그것은 그러나이 솔루션은 여전히 ​​나를 위해 작동 사실 found here로에 문제의 실제 cuase가 동적 업데이트 세트를 나타납니다.

변경 사항은 이전에 호출 된 OnFlushDirty 함수에서 업데이트 할 때 저장됩니다.

public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types) 
{ 
    bool result = false; 

    if (entity is IAuditable) { 
     var auditable = (IAuditable)entity; 

     Set(x => auditable.Modifier, propertyNames, auditable, currentState, SecurityManager.Identity); 
     //Set(x => auditable.DateModified, args.Persister, auditable, args.State, TwentyClock.Now); 

     result = true; 
    } 

    return result; 
} 
+0

연결된 "대답"은 같은 페이지로 다시 연결됩니다 ....... –

+0

@Max Schilling 죄송합니다,이 답변이 더 좋습니까? –

관련 문제