3

私は次のオブジェクト構造を持っています(簡略化):

MainObject
  Person PersonA
  Person PersonB
Person
  string Name
  Status Status

基本的に、私は2つのオブジェクトMainObjectを保持できました。Personオブジェクトは (このPersonビジネス ケースの場合) 常に異なるオブジェクトになりますが、StatusそれぞれのオブジェクトPersonは同じオブジェクトを参照する場合がありますStatus(たとえば、両方のステータスが DocumentsUploaded である場合があります)。

MainObjectFluent NHibernate を使用しているため、両方Personの s が同じ場合に a を保存しようとすると、次の例外が発生しStatusます 。同じ識別子の値を持つ別のオブジェクトが既にセッションに関連付けられています。Status両方のオブジェクトが同じであるため、これは理にかなっています。

エラーをグーグルで調べたところ、誰かが誤ってセッションで同じ識別子を取得したことが判明した投稿がほとんど見つかりました(そして、意図的にそれを行いたいです)。

Statusフィールドを整数に変更することも検討しPersonましたが、それは間違っているように感じます (オブジェクト指向ではありません)。

質問:これを回避する方法はありますか? はい、同じ識別子を持っていることはわかっていますが、とにかくそれを保存したいと NHibernate に伝える方法はありますか? そうでない場合、これが不可能な理由は何ですか?また、あなたの提案は何ですか?

それが重要な場合。

これが私のリポジトリのコードです:

public void Save<T>(T entity) where T : DomainEntity
{
    using (var session = _sessionSource.CreateSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity);
            transaction.Commit();
        }
    }
}

( MainObjectPersonおよびStatusすべて継承DomainEntityし、上記のシナリオを除いてすべて正常に動作します)

編集:ロード用のコード

これは、のStatus各 にをロードするための簡略化されたコードです。PersonMainObject

_mainObject.PersonA.Status = _repository.GetStatus(StatusCode.NotSet);
_mainObject.PersonB.Statys = _repository.GetStatus(StatusCode.NotSet);

これは、リポジトリ内の GetStatus の簡略化されたコードです。

public Status GetStatus(StatusCode statusCode)
{
    return Repository.Query<Status>(x => x.StatusCode == statusCode).FirstOrDefault();
}

そして、これはクエリのコードです:

public List<T> Query<T>(Expression<Func<T, bool>> expression) where T : DomainEntity
{
    using (var session = _sessionSource.CreateSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            var result = session.Query<T>().Where(expression);
            transaction.Commit();
            return result.ToList();
        }
    }
}

前もって感謝します!

4

1 に答える 1

2

問題はセッションのマイクロマネジメントだと思います。すべてのデータベーストランザクションをカバーする1つのセッションがあった場合、問題が発生するとは思われません。

プロジェクトがWebサービスの場合は、セッションの作成/破棄をhttpリクエストに関連付けることを検討することをお勧めします。

于 2012-10-26T11:33:32.737 に答える