我有一个Animal
实现IDomainObject
. 还有另一个类 ,Cat
它继承自Animal
。我正在为我的 NHibernate 映射使用 Table Per Subclass 继承策略,并将CreatedDate
andLastModified
属性映射到表中的Animal
列和表中的列Cat
。
我还使用 PreUpdate 事件处理程序为 LastModified 分配一个值。
当我更新 Cat 对象中的属性时,两个 UPDATES 被发送到数据库:一个 forAnimal
和一个 for Cat
。但是,UPDATE forAnimal
是获取新 LastModified 值的那个,而 UPDATE forCat
保留旧值。
当在另一个会话中再次检索 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;
}