我有一個Animal
類實現IDomainObject
。還有另一個類,Cat
,從Animal
繼承。我爲我的NHibernate映射使用Table Per Subclass繼承策略,並將CreatedDate
和LastModified
屬性映射到Animal
表中的列以及Cat
表中的列。問題與NHibernate審計和繼承類
我還使用PreUpdate事件處理程序爲LastModified賦值。
當我更新Cat對象中的一個屬性時,會將兩個UPDATES發送到數據庫:一個用於Animal
,另一個用於Cat
。但是,Animal
的更新是獲取新的LastModified值的UPDATE,並且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和版本,並把它們放在它們自己的類和表中,分別通過私有成員和外鍵引用。 – 2010-08-18 17:40:22