我知道这是一个古老的线程,但在新读者的兴趣:
基于使用VS 2012,MVC 4和EF 4.0与具有EF对象为提交的模型视图我的看法形成回控制器。
在控制器:
public ActionResult SubmitEFObject(tblData data, FormCollection col)
“数据” 将只具有在填充视图(@ Html.xxxFor)中使用的性质。
看起来,当创建“数据”时,发布的FormCollection用于设置数据的属性。如果您有一个未使用的属性,例如DataID,则data.DataID将具有空值/默认值。将“@ 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();
}
你可以让这个更通用的使用反射或也许更有效的通过字符串[]字段,而不是所有的IFS循环,但对于我而言,这是“足够好”。
我的数据库调用存储在库中。我试图找出什么时候打电话给他们以最大限度地利用EF。至于你的问题,我试图用这些问题来确定。看起来我最好使用EF,如果我模型绑定查询EF对象提前,以便它可以使用并发性和更好的跟踪状态。 – RailRhoad 2009-12-29 16:36:58
我不会将EF对象直接暴露给“模型绑定”,我将使用自己的域对象或DTO,并将这些对象映射到EF对象上。 – 2009-12-29 18:38:51