2009-02-03 41 views
5

这里有一点点,但我有一个客户对象回到我的控制器。我想重新连接这个对象回数据库,这甚至有可能吗?我知道有一个datacontext.customers.insertonsubmit(客户),但有没有相当于datacontext.customers.updateonsubmit(客户)???使用MVC框架RC1更新断开连接的LINQ对象

回答

0

您希望在数据上下文的customers表上使用attach方法。

datacontext.customers.Attach(customer); 

将其重新连接到数据上下文。然后,您可以使用SubmitChanges()来更新数据库中的值。

编辑:这只适用于通过序列化从原始数据上下文中分离出来的实体。如果您不介意额外调用数据库,则可以使用ASP.NET MVC中的惯用方法来再次检索对象,并通过UpdateModel或TryUpdateModel应用您的更改,如@Odd所示。

+0

上次我跑过这个(几个月前)时,我总是在这个声明中遇到错误。一些关于(解释)“这个对象最初附加到另一个数据上下文”,它不能被附加...有没有最近改变 – 2009-02-03 21:38:15

3

您从表单发布的客户将没有实体关键字,因此可能无法很好地连接,也可能没有客户的每个字段都可用于表单,因此可能没有设置所有字段。

我建议使用TryUpdateModel方法,在您的操作中,您必须再次从数据库获取客户并使用表单的后置变量更新它。

public ActionResult MySaveAction(int id, FormCollection form) 
{ 
    Customer updateCustomer = _Repository.GetCustomer(id); 

    TryUpdateModel(updateCustomer, "Customer", form); 

    _Repository.Save(updateCustomer); 
} 

你将不得不添加所有你自己的异常处理和验证当然,但这是一般的想法。

5

这是我不喜欢的关于LINQ到SQL的内容。

如果您在同一范围内查询和更新,它通常会正常工作,但如果您获取对象,请将其缓存,然后尝试稍后更新它,则不能。

这里是什么文件说:

使用与已经在一个DataContext的创建实体的连接方法,以及序列化到客户端,然后有意向反序列化回执行更新或删除操作。由于新的DataContext无法跟踪断开连接的实体的原始值,客户端负责提供这些值。在此版本的Attach中,假定实体处于其原始值状态。调用此方法后,可以更新其字段,例如使用客户端发送的其他数据。

不要尝试附加尚未通过序列化分离的实体。尚未序列化的实体仍与延迟加载程序保持关联,如果实体被第二个数据上下文跟踪,那么这些实体可能会导致意外的结果。

有点模棱两可的恕我直言,特别是关于什么意思是“序列化”和“反序列化”。

而且,有趣的是,这里是怎么说的DataContext对象:

一般来说,一个DataContext实例 设计寿命为一个“ 工作单位”但是你的应用程序定义 这个词。一个DataContext是 轻量级,并且对于 创建并不昂贵。典型的LINQ to SQL 应用程序在方法范围创建DataContext 实例或作为 代表相关 数据库操作的逻辑集的短命类成员。

因此,DataContexts的使用范围很广 - 而且要使用Attach(),您必须使用相同的DataContext来查询对象。我假设/希望我们完全误解了Attach()的真正用途。

我在这种情况下必须做的事情是重新查询我需要更新的对象以获取全新副本,然后执行更新。