0

How would I use nHibernate,configured by fluent nhibernate if it makes any difference, to load an entity using natural/alternate key in some cases, rather than the primary key when using the Load method on an ISession.

I still need the functionality to allow me to do both, and in the majority of cases, the entity will be loaded via the PKey, but in some cases (where an external system is involved), I need to select the record using the natural key.

I'd like to keep the performance benefit Load allows, rather than do a query etc.

 // Current
 int countryID = 1; // from normal input source

 Address a = new Address();
 a.Country = session.Load<Country>(countryID);

 session.SaveOrUpdate(a);

 // Required
 string countryCode = "usa"; // from external input source

 Address a2 = new Address();
 a2.Country = session.LoadViaNatualKeySomehow<Country>(c=> c.Code, countryCode); // :)

 session.SaveOrUpdate(a2);
4

1 に答える 1

4

私の知る限り、それは不可能です。Ayendes の投稿でわかるように、私の知る限り、NHibernate API 全体で唯一の自然な ID である基準のクエリ構文があります。このクエリは、この投稿で説明されている第 2 レベルのキャッシュ処理を除いて、「通常の」クエリに変換されます。

少なくともセッションをフラッシュしないとよいでしょう。

実行できる簡単なパフォーマンス強化の 1 つは、(不変の!) 自然 ID でクエリを実行する前に自動フラッシュをオフにすることです。

session.FlushMode = FlushMode.Never;
session.CreateQuery(...by natural id ...);
session.FlushMode = FlushMode.Auto;

これは大きな違いを生む可能性がありますが、もちろん Load と競合することはありません。

存在しない理由は、おそらく、セッション内のエンティティがすべて ID によって識別されるという事実です。

あなたがそれを持っていた場合:

var entity1 = session.Load<Entit>(id);
// does not exist
var entity2 = session.LoadByNaturalKey(natural id);

データベースからロードせずに、id と自然な id が同じオブジェクトを識別していると NH が判断するにはどうすればよいでしょうか? セッションキャッシュ全体が問題になります。

于 2012-04-05T14:40:26.043 に答える