私はこれが古いスレッドであることを知っていますが、新しい読者の利益のために:
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 []フィールドをループすることでより効率的にすることができますが、私の目的ではこれで十分でした。