1

前に、(投稿時に) クライアント オブジェクトを渡す AddClient ページを作成し、リポジトリで db.AddToClient(obj) を使用して永続化しました。簡単なもの。

これで、保存がアクション「UpdateClient」に投稿を送信する詳細ページがあります。そのアクションが実行される前に、カスタム モデル バインダーが Client オブジェクトを作成し、それがアクションに渡されます。問題は、このクライアント オブジェクトがまだ EF コンテキストに接続されていないことです。それを行う正しい場所はどこですか?モデルバインダーで、またはコントローラーから取得するとき、またはリポジトリ呼び出しを行ってそこにリンクするまで待つのでしょうか? 推奨されるプロセスは何ですか?

4

4 に答える 4

0

EFオブジェクトがコンテキストの外部で作成されている場合は、オブジェクトをコンテキストにアタッチする必要があります。

参照: http: //msdn.microsoft.com/en-us/library/bb896271.aspx

于 2009-12-29T16:23:58.453 に答える
0

私はこれが古いスレッドであることを知っていますが、新しい読者の利益のために:

VS 2012、MVC 4、およびEF 4.0を使用した私の観察に基づいて、フォームをコントローラーに送信するモデルのEFオブジェクトを持つビューを使用します。

コントローラ上:

public ActionResult SubmitEFObject(tblData data, FormCollection col)

「データ」には、ビュー(@ Html.xxxFor)で使用されるプロパティのみが入力されます。

「データ」が作成されると、投稿されたFormCollectionがデータのプロパティを設定するために使用されるようです。使用されていないプロパティ(たとえば、DataID)がある場合、data.DataIDの値はnull/デフォルトになります。ビューに「@Html.Hidden(m => m.DataID)」を追加すると、DataIDが入力されます。

これを操作するための「クイックアンドダーティ」な方法として、着信する「データ」をデータベース内の「データ」とマージし、マージされたオブジェクトを返すメソッドを作成しました。

// Note: error handling removed
public tblData MergeWithDB(DBContext db, tblData data, params string[] fields)
{
  tblData d = db.tblData.Where(aa => aa.DataID == data.DataID).Single();
  if (fields.Contains("Field1")) d.Field1 = data.Field1;
  if (fields.Contains("Field2")) d.Field2 = data.Field2;
  if (fields.Contains("Field3")) d.Field3 = data.Field3;
  // etc...
  return d;
}

コントローラ上:

public ActionResult SubmitEFObject(tblData data, FormCollection col)
{
  DataEntities db = new DataEntities();
  tblData d = MergeWithDB(db, data, col.AllKeys);
  db.SaveChanges();
}

リフレクションを使用してこれをより一般的にするか、すべてのifの代わりにstring []フィールドをループすることでより効率的にすることができますが、私の目的ではこれで十分でした。

于 2013-03-06T22:13:12.653 に答える
-1

データベース作業は、リポジトリ呼び出しに入れる必要があります。

モデル バインディングでエンティティ フレームワーク オブジェクトに直接バインドしていますか? そうでない場合は、カスタム オブジェクトとエンティティ フレームワーク オブジェクトの間のマッピングを検討する必要があります。

于 2009-12-29T16:17:48.000 に答える