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;
これをどのように行うべきですか?