この問題の原因となっている問題を解決しました。
複合 ID にも解決されます。
プロジェクトの早い段階で、Nhibernate は Equals と GetHashCode をオーバーライドしていないことを警告していました。多くのコード変更を回避し、コードの再利用を促進するために、私は CompositeBaseEntity クラスを作成しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Case.Infrastructure
{
public class BaseCompositeEntity : BaseEntity
{
public override int GetHashCode()
{
return base.GetHashCode();
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
}
このクラスは、Nhibernate が私に避けるように言っていたものを元に戻します! 等しいかどうかを比較する 2 つのキーがあるため、次のようになるように Equals および GetHashCode() メソッドをオーバーライドする必要があります。
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as ClientMatterEntity;
if (t == null)
return false;
if (AccountNumber== t.ClientAcconuntNumber && CaseNumber == t.CaseNumber)
return true;
return false;
}
このようにして、Nhibernate は比較がどのように行われるべきかを正確に認識し、そのオブジェクトが第 1 レベルのキャッシュにあるかどうかを認識します (フェッチを指定したように、そうします)。
詳細については、http:
//nhforge.org/blogs/nhibernate/archive/2010/07/01/nhibernate-and-composite-keys.aspxを参照してください。