4

ドロップダウンリストの選択とPOCO EFでの選択の永続化のための適切なパターンに関するアドバイスを探しています。

IEnumerable<Country>ビュー モデルに、Country が EF 経由で読み込まれた POCO であるリストがあります。ビュー モデルには、Country プロパティで現在の値またはユーザーが選択した値を取得する Address プロパティがあります。ビュー内で、Html.DropdownListFor() を介してこれらを表示します。

Html.DropDownListFor(model => model.Address.Country.Id, new SelectList(Model.Countries,"Id","Name",model.Address.Country.Id)

これまでのところ、すべてがポストバックで機能し、デフォルトの ModelBinder を使用して、Address.Country が入力されたビュー モデルを提供します。ただし、もちろん Address.Country には、デフォルトのモデル バインディングの Id フィールドのみが入力されます。

EF を介してアドレスの更新を DB に送り返そうとすると、完全なオブジェクト グラフが読み込まれておらず、ID が設定されているだけの新しいオブジェクトと見なされるため、失敗します。

これで、選択した ID に基づいて保存する前に、データベースから完全な Country オブジェクトをポストバックの Address.Country プロパティに読み込むことで、これを修正できます。しかし、これは、単純なオブジェクト グラフを超えて、大変な作業のように思えます。

私が考えることができる最も「エレガントな」ソリューションは、Country のカスタム モデル バインダーですが、完全な EF オブジェクトを取得するためのリポジトリについて Model Binder が知る必要があります。ドロップダウン リストで使用される他のすべてのエンティティについても、これを繰り返す必要があります。

これが理にかなっていることを願っており、他の人がこれをどのように行っているかについてのフィードバックをいただければ幸いです.

4

2 に答える 2

0

Address クラスで、country を virtual として宣言します

public class Address
{
  public virtual Country Country;
}

これを試して、うまくいくかどうか教えてください。仮想は遅延読み込みをサポートしており、明示的にクエリを実行する必要はありません

于 2013-01-04T10:26:06.200 に答える
0

Address.Country をオブジェクトに設定すると、EF はそれが現在のコンテキストの一部である完全なオブジェクトであると想定しますが、EF は外部キーを認識します。Address オブジェクトに CountryID プロパティと Country プロパティの両方がある場合、Address を受け入れる必要があります。 Address.Country 自体が null である限り、.CountryID が設定されます。

于 2010-10-25T15:33:10.460 に答える