2009-12-29 270 views
1

早些时候,我创建了一个AddClient页面(发布时)传递客户端对象,并在存储库中使用db.AddToClient(obj)来保存它。简单的东西。模型绑定实体框架(ASP.NET MVC)

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

回答

-1

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

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

+0

我的数据库调用存储在库中。我试图找出什么时候打电话给他们以最大限度地利用EF。至于你的问题,我试图用这些问题来确定。看起来我最好使用EF,如果我模型绑定查询EF对象提前,以便它可以使用并发性和更好的跟踪状态。 – RailRhoad 2009-12-29 16:36:58

+0

我不会将EF对象直接暴露给“模型绑定”,我将使用自己的域对象或DTO,并将这些对象映射到EF对象上。 – 2009-12-29 18:38:51

0

如果在上下文之外创建了EF对象,则需要将附加到对象上下文中。

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

+0

如果我在完成对象之后等待附加,请不要失去EF的并发检查的好处?另外,该附加看看我的对象,并在数据库中同步到一个? – RailRhoad 2009-12-29 16:29:41

+0

另外,将对象附加到上下文会使其保持不变的状态。我不想先查询它(在模型绑定之前),然后让它绑定。那么它可以正确地确定国家的权利? – RailRhoad 2009-12-29 16:33:58

+0

Attached对象将是一个新对象,如果您想更新现有对象,您需要先从数据库中获取它,进行更改并保存更改。 – 2009-12-29 16:57:40

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(); 
} 

你可以让这个更通用的使用反射或也许更有效的通过字符串[]字段,而不是所有的IFS循环,但对于我而言,这是“足够好”。