2

NHibernate で文字列 ID が割り当てられたエンティティがあり、ID でエンティティを取得するときに少し問題があります。

例...

このようなデータベースレコードがあるとします...

Id    Description
-------------------
AAA   MyDescription

さて、検索ID「aaa」を使って「Get」メソッドを使うと・・・

MYENTITYTYPE entity = Session.Get<MYENTITYTYPE>("aaa")

正しいエンティティを返しますが、Id フィールド (entity.Id) は「aaa」ですが、「AAA」と等しいといいのですが。

要約すると、「Get」メソッドがデータベースに保存されているものと同じIDを返すことを望みます...同じケースで。

可能です?どのようにできるのか?

4

1 に答える 1

1

興味深い質問です。Idは DB 呼び出しのに存在する可能性があるため、それは不可能だと思います。次の点を考慮してください。

var foo = session.Load<Foo>("aaa"); //no DB call, foo is a proxy
Console.WriteLine(foo.Id); //Prints "aaa";
var bar = foo.Bar; //Forces loading
Console.WriteLine(foo.Id); //No matter what, the Id can't change at this point

これは、特に入力が制御されていない場合に、意味のある主キーが通常悪い考えであるもう 1 つの理由を示しています。

ここで、クエリを使用する代わりに、Get大文字と小文字が区別された Id を取得します。

//example with LINQ; you can use HQL, Criteria, etc
var foo = session.Query<Foo>().Single(x => x.Id == "aaa");

欠点は、エンティティが既に読み込まれている場合でも、常に DB に移動することです。

ここで、エンティティを{Id, Code, Description}として定義した場合、ここでIdは合成 POID ( HiloまたはGuidをお勧めします) であり、 は既存の文字列 Id であり、クエリの代わりにコードをCode使用することによって引き起こされる潜在的なバグを回避できます。 Get.

于 2012-05-28T14:00:31.147 に答える