使用MVC Framework RC1更新断开连接的LINQ对象

时间:2009-02-03 21:27:21

标签: asp.net-mvc linq-to-sql

这有一点但我有一个客户对象回到我的控制器。我想将此对象重新连接回数据库,是否可能?我知道有一个datacontext.customers.insertonsubmit(客户),但有没有等效的datacontext.customers.updateonsubmit(客户)???

3 个答案:

答案 0 :(得分:5)

这是我不喜欢的LINQ-to-SQL。

如果你在相同的范围内查询和更新,它通常可以正常工作,但如果你得到一个对象,缓存它,然后尝试稍后更新它,你就不能。

以下是文档说的内容:

  

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

     

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

有点暧昧的恕我直言,特别是关于“序列化”和“反序列化”的含义。

另外,有趣的是,这里是关于DataContext对象的内容:

  

通常,DataContext实例是   旨在持续一个“单位   工作“但你的应用程序定义   那个词。 DataContext是   轻便且不贵   创建。典型的LINQ to SQL   应用程序创建DataContext   方法范围或实例   昙花一现的成员   代表一组相关的逻辑   数据库操作。

因此,DataContexts旨在严格限定范围 - 但是要使用Attach(),您必须使用查询该对象的相同DataContext。我假设/希望我们完全误解了Attach()的用途。

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

答案 1 :(得分:3)

您从表单发布的客户将没有实体密钥,因此可能无法很好地附加,您也可能没有表单上的所有客户字段,因此可能无法设置所有字段。

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

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

    TryUpdateModel(updateCustomer, "Customer", form);

    _Repository.Save(updateCustomer);
}

当然,您必须添加所有自己的异常处理和验证,但这是一般的想法。

答案 2 :(得分:0)

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

datacontext.customers.Attach(customer);

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

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