Animal
클래스에 IDomainObject
을 구현했습니다. Animal
을 상속하는 다른 클래스 Cat
이 있습니다. 내 NHibernate 매핑에 대한 테이블 당 하위 클래스 상속 전략을 사용하고 CreatedDate
및 LastModified
속성을 Animal
테이블의 열과 Cat
테이블의 열에 매핑합니다.NHibernate 감사 및 상속 된 클래스의 문제
또한 PreUpdate 이벤트 처리기를 사용하여 LastModified에 값을 할당합니다.
Cat 개체의 속성을 업데이트 할 때 Animal
및 Cat
중 하나에 대해 데이터베이스에 두 개의 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;
}
난 그냥 CreateDate, LastModified 및 버전을 추출하여 자신의 클래스와 테이블에 넣어, 다시 개인 회원과 외래 키를 통해 참조하는 것 같아요. –