0

を実装するAnimalクラスがありますIDomainObjectCatから継承する別のクラス があり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;
}
4

1 に答える 1

2

私が理解していない2つのこと:

  1. 新しい機能がないのに、なぜ Cat クラスで CreatedDate、LastModified、および Version をオーバーライドするのですか?

  2. 両方のテーブルにこれら 3 つの列があるのはなぜですか?

基本クラスに 3 つの列/プロパティがあれば十分なはずです。それ以外の場合は、問題が発生します。

于 2010-08-18T18:27:23.233 に答える