2

エンティティ

NHibernate を使用してロードされる Product というエンティティーがあります。

製品には、NHibernate が喜んで入力してくれるカテゴリがあります。

データベース

データベースでは、Product にカテゴリの外部キーがあります。

シナリオ

ユーザーはこの製品を (Web インターフェイス経由で) 編集し、別のカテゴリを選択します (たとえば、「魚」の代わりに「野菜」を選択します)。

これはおそらく、各カテゴリが表示されたドロップダウン リストです。彼らが別のカテゴリを選択すると、int キーが取得されます。

問題

変更を Product に保存したいのは明らかですが、実際には変更は新しい int (1 ではなく 2 など) を保存することだけです。

したがって、既存の製品を取得すると、問題が発生します。

Product には「CategoryID」フィールドはありません。Category プロパティしかありません。

しかし、製品に割り当てるためだけに (ID で) カテゴリを取得する必要はありません。

だから私が知りたいのは...

a) CategoryID プロパティを製品に追加します

b)新しいカテゴリを作成し、関連するIDを割り当てて製品に添付します(ただし、エラーが発生するか、既存のカテゴリを上書きします)

c) システムからカテゴリを取得 (ルックアップ) し (ID で)、それを製品に添付します。

d) まったく別のことをする!

4

3 に答える 3

4

Session.Load(id) 機能を使用できるようです。

Session.Load は、別のプロパティを要求してロードするまで、ID を持つプロキシを返す特別なメソッドです。ID に一致するアイテムがない場合は、エラーがスローされます。次のようなものを試してください:

product.Category = Session.Load<Category>(2); //2 being the new category ID

Session.SaveOrUpdate(product);

少しテストしただけで、カテゴリ全体が引き戻されるようには見えませんでした。

于 2009-11-19T18:22:47.347 に答える
2

更新: Session.Load が正解です

product.Category = session.Load<Category>(2);

session.Save(product);
于 2009-11-19T22:34:58.687 に答える
0

NH を使用EnumStringType<T>して、カテゴリを列挙型としてそれぞれのデータベース値 (文字列または数値) にマップします。グーグルで検索すると、かなりの数の使用例が見つかります。

チッ!

于 2009-11-19T17:51:38.410 に答える