1

NHibernateは初めてですが、EF4についてよく理解しています。

基本的な「アイテムの編集」ページがあり、送信時にフォームの値でアイテムオブジェクトを更新したいと思います。FWIW、私はFormViewを使用しており、実用的な場合は新しいWebFormsモデルバインディング機能を活用しています。

私の「Item」オブジェクトには次のプロパティがあります。

public virtual Category Category { get; set; }

これは、データベース内のFK関係に対応します(テーブル「Category」を指す列「CategoryId」)。

したがって、私のフォームには「カテゴリ」ドロップダウンがあります。このドロップダウンには、すべてのカテゴリオブジェクトのリストがロードされています。

送信時に、Categoryドロップダウンで選択した値をItemオブジェクトのCategoryプロパティに割り当てるだけです。かなり簡単ですよね?:)

しかし、私は困難に遭遇しました:

  • dropdown.SelectedValueは簡単に取得できますが、これをItemオブジェクトに割り当てることはできません。EF4では、私のItemオブジェクトは外部キーの関連付けを使用するため、プロパティの両方がCategoryありCategoryId、自動的に同期が保たれます。NHibernateで同様のことを試したところ、単一の列を複数回使用しようとしたため、このSqlParameterCollectionエラーのインデックスが無効になりました。

  • dropdown.SelectedItemは簡単に取得できますが、これはListItemタイプであり、にキャストすることはできませんCategory

  • dropdown.DataSourceプロパティ(「SelectedIndex-th」アイテムにアクセスする可能性があります)を使用しようとしましたが、コードをステップ実行すると、このDataSource値はnullでした。

これまでの私の最善の(ひどい)解決策は次のとおりです。

var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
var id = dropdown.SelectedValue;
var category = new MyRepository().GetCategoryById(id);
item.Category = category;

したがって、追加のリポジトリ呼び出しを行い、Categoryオブジェクト全体を再度取得します。本当にやりたいのは、次のことだけです。

item.CategoryId = id;

これをどのように行うべきですか?

4

2 に答える 2

1

ID がわかっている場合は、Session.Loadを使用して、データベースへのトリップを回避します。Load は動的プロキシを作成し、アイテムを正しい CategoryId で永続化できるようにします。Load は、ステートレス アプリケーションの最適なソリューションです。

var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
var id = dropdown.SelectedValue; // may need to cast to int
item.Category = session.Load<Category>(id);
于 2012-11-08T18:14:33.620 に答える
0

カテゴリ オブジェクトを取得する必要はありません。新しいカテゴリ オブジェクトを作成して、id を動的に設定するだけです。

var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
var id = dropdown.SelectedValue;
item.Category = new Category { CategoryId = id };
于 2012-11-08T11:49:35.500 に答える