1

早些时候,我创建了一个 AddClient 页面,该页面(发布时)传递了一个客户端对象,并在我的存储库中使用 db.AddToClient(obj) 来持久化它。容易的东西。

现在,我有一个详细信息页面,其保存将帖子提交到操作“UpdateClient”。在执行该操作之前,我的自定义模型绑定器会创建我的 Client 对象并将其方便地传递给操作。问题是,这个客户端对象还没有连接到 EF 上下文。这样做的正确地点在哪里?在模型绑定器中,或者当我们从控制器获取它时,或者我们等到我们调用存储库并将其链接到那里?推荐的流程是什么?

4

4 回答 4

1

据我记得,您要么需要再次将对象附加到上下文并将其设置为已修改

或者从数据库重新加载对象并应用您的更改。

这篇文章更好地解释了它:

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx#id0090022

你用的是什么版本的EF?

于 2010-01-04T04:56:13.177 回答
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 将具有空值/默认值。将“@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();
}

您可以使用反射使其更通用,或者通过遍历 string[] 字段而不是所有 if 来提高效率,但出于我的目的,这“足够好”。

于 2013-03-06T22:13:12.653 回答
-1

数据库工作应该放在存储库调用中。

您是否直接绑定到模型绑定中的实体框架对象?如果没有,您应该考虑在您的自定义对象和实体框架对象之间进行一些映射。

于 2009-12-29T16:17:48.000 回答