を実装するAnimal
クラスがありますIDomainObject
。Cat
から継承する別のクラス がありAnimal
ます。私は NHibernate マッピングに Table Per Subclass 継承戦略を使用しており、CreatedDate
およびLastModified
プロパティをAnimal
テーブルの列とテーブルの列にマップしていCat
ます。
また、PreUpdate イベント ハンドラーを使用して、LastModified に値を割り当てます。
Cat オブジェクトのプロパティを更新すると、2 つの UPDATE がデータベースに送信されます。1 つは 用Animal
、もう 1 つは 用Cat
です。ただし、UPDATEAnimal
は新しい LastModified 値を取得するものであり、UPDATECat
は古い値を保持します。
これにより、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;
}