私は次のオブジェクト構造を持っています(簡略化):
MainObject
Person PersonA
Person PersonB
Person
string Name
Status Status
基本的に、私は2つのオブジェクトMainObject
を保持できました。Person
オブジェクトは (このPerson
ビジネス ケースの場合) 常に異なるオブジェクトになりますが、Status
それぞれのオブジェクトPerson
は同じオブジェクトを参照する場合がありますStatus
(たとえば、両方のステータスが DocumentsUploaded である場合があります)。
MainObject
Fluent 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();
}
}
}
( MainObject
、Person
およびStatus
すべて継承DomainEntity
し、上記のシナリオを除いてすべて正常に動作します)
編集:ロード用のコード
これは、のStatus
各 にをロードするための簡略化されたコードです。Person
MainObject
_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();
}
}
}
前もって感謝します!