2013-12-11 2 views
1

이벤트 청취자를 사용하여 감사 로깅을 구현할 때 nhibernate에서 링크 엔터티 (외래 키) 값을 가져 오는 방법. 링크 엔티티를 제외하고 모든 엔티티 속성을 로그 할 수 있습니다. 링크 엔티티는 값 대신 링크 엔티티의 이름 만 로깅합니다.NHibernate - 감사 로깅 목적으로 postinsert 이벤트에서 연결된 엔터티 값을 얻는 방법

누군가가 올바른 방향으로 나를 가르키거나 샘플 코드를 제공하면 좋을 것입니다. 내가 현재 가지고있는 것입니다.

public void OnPostInsert(PostInsertEvent @event) 
{ 
     if (@event.Entity is AuditLog) 
     { 
      return; 
     } 

     ISession session = @event.Session.GetSession(EntityMode.Poco); 
     string username = httpContextHelper.GetCurrentUsersLoginName(); 
     var props = @event.State; 

     for (int i = 0; i < props.Length; i++) 
     { 
      string newValue = string.Empty; 

      //Tried this but obj always null............ 

      //var obj = props[i] as INHibernateProxy; 
      //if (obj != null) 
      //{ 
      // newValue = obj.HibernateLazyInitializer.Identifier.ToString(); 
      // session.Evict(props[i]); 
      //} 

      newValue = (props[i] == null) ? string.Empty : props[i].ToString(); 

      if (props[i] != null) 
      { 
       session.Save(new AuditLog 
       { 
        AuditEntryType = "Insert", 
        DomainFullName = @event.Entity.GetType().FullName, 
        DomainShortName = @event.Entity.GetType().Name, 
        OldValue = string.Empty, 
        FieldName = @event.Persister.PropertyNames[i], 
        NewValue = newValue, 
        DomainId = (int)@event.Id, 
        Timestamp = DateTime.Now, 
        Username = username 
       }); 
      } 
     } 
    } 

답변

0

@ event.Entity에서 이름으로 속성 값을 가져 오지 않는 이유는 무엇입니까? 임명 nhibernate (C#)에서 내 src을 cheking propertyNames라는 매개 변수 때문에 나는 반성을 사용하여 그들을 얻을 수 있기 때문에 이름이 최대 절전 모드에 있는지 모르겠다.

1

링크 된 개체 속성이 링크 된 개체 자체 또는 ID 값을 참조합니까?

속성이 연결된 개체 인 경우 메서드는 링크 된 개체 (기본적으로 클래스 이름)에서 .ToString() 메서드를 호출하기 만합니다. 아래 예제에서 블로그를 로깅했다면 작성자는 단순히 "MyNamespace.Author"와 같은 클래스 이름이거나 .ToString()을 재정의 할 때 출력 한 내용 일뿐입니다.

public class Blog 
{ 
    public virtual int ID {get;set;} 

    public virtual string Name {get;set;} 

    public virtual Author Author {get;set;} 

    // more properties 
} 

public class Author 
{ 
    public virtual int ID {get;set;} 

    public virtual string Name {get;set;} 

    public virtual DateTime Birthday {get;set;} 
} 

// property design as used with XML mappings 

여러 가지 옵션이 있습니다 :

  • 가 외국인 ID와 다른 속성을 추가, 예 : "INT AuthorID"로, 그리고합니다 (FK 컬럼
  • 를 사용하여 A로 .toString에 매핑) 구현 관련 객체 (사람이 읽을 수있는 것) 만 식별 할 수 있습니다.
  • "blogToLog.Author.ID"와 같은 객체의 ID를 가져옵니다. 여기에는 몇 가지 단점이 있습니다. 로깅 루틴에 특별한 경우가 필요합니다. 로깅은 관련 객체에 대한 지연로드를 호출 할 수 있습니다 (의미 : 로깅을 위해 DB에서로드).
  • ID 속성을 사용하여 인터페이스를 만들고 모든 영구 클래스가 구현하도록하고 속성이 클래스 유형 인 경우 캐스팅하여 ID를 출력하십시오.