2010-08-18 5 views
0

Animal 클래스에 IDomainObject을 구현했습니다. Animal을 상속하는 다른 클래스 Cat이 있습니다. 내 NHibernate 매핑에 대한 테이블 당 하위 클래스 상속 전략을 사용하고 CreatedDateLastModified 속성을 Animal 테이블의 열과 Cat 테이블의 열에 매핑합니다.NHibernate 감사 및 상속 된 클래스의 문제

또한 PreUpdate 이벤트 처리기를 사용하여 LastModified에 값을 할당합니다.

Cat 개체의 속성을 업데이트 할 때 AnimalCat 중 하나에 대해 데이터베이스에 두 개의 UPDATES가 전송됩니다. 그러나 Animal에 대한 UPDATE는 새 LastModified 값을 가져 오며, Cat에 대한 UPDATE는 이전 값을 유지합니다.

Cat 엔터티가 다른 세션에서 다시 검색 될 때 약간의 문제가 발생합니다. LastModified가 새 값 (Animal)으로 덮어 쓰여진 것처럼 보이며 효과적으로 엔티티에 더티가 있음을 표시하고 다른 UPDATE를 트리거합니다.

전체적인 디자인에 문제가있는 것 같지만 그게 무엇인지 잘 모르겠습니다. 이것에 대해 더 좋은 방법은 무엇입니까?

public class Animal : IDomainObject { 
    // ... various properties 

    public virtual DateTime CreatedDate { get; set; } 
    public virtual DateTime LastModified { get; set; } 
    public virtual int Version { get; protected set; } 
} 

public class Cat : Animal { 
    // ... various properties 

    public override DateTime CreatedDate { get; set; } 
    public override DateTime LastModified { get; set; } 
    public override int Version { get; protected set; } 
} 

public interface IDomainObject { 
    DateTime CreatedDate { get; set; } 

    DateTime LastModified { get; set; } 

    int Version { get; } 
} 

public bool OnPreUpdate(PreUpdateEvent eventItem) { 
    if (!(eventItem.Entity is IDomainObject)) { 
     return false; 
    } 

    var entity = eventItem.Entity as IDomainObject; 

    if (entity == null) { 
     return false; 
    } 

    var lastModified = DateTime.Now; 

    PersistState(eventItem.Persister, eventItem.State, "LastModified", lastModified); 

    entity.LastModified = lastModified; 

    return false; 
} 

private void PersistState(IEntityPersister persister, object[] state, string propertyName, object value) { 
    var index = Array.IndexOf(persister.PropertyNames, propertyName); 

    if (index == -1) { 
     return; 
    } 

    state[index] = value; 
} 
+0

난 그냥 CreateDate, LastModified 및 버전을 추출하여 자신의 클래스와 테이블에 넣어, 다시 개인 회원과 외래 키를 통해 참조하는 것 같아요. –

답변

2

두 가지 이해가 안 :

  1. Cat-class에서 CreatedDate, LastModified 및 Version을 대체하는 이유는 무엇입니까?

  2. 왜 세 열이 모두 개입니까?

baseclass에는 세 개의 열/속성이 있어야합니다. 다른 것은 문제가 있습니다.

+0

+1 : 기본 클래스에 그대로 두지 않는 것이 좋습니다. – DanP

+0

이것은 완전히 이해가됩니다. 감사. –

+0

동일한 문제가 있습니다. 안타깝게도 db 디자인을 관리하는 데이터 팀은 모든 테이블에서 감사 열을 필요로합니다. 이 문제를 해결할 수있는 해결책이 있습니까? –