Asp.net mvc 使用MVC框架RC1更新断开连接的LINQ对象

Asp.net mvc 使用MVC框架RC1更新断开连接的LINQ对象,asp.net-mvc,linq-to-sql,Asp.net Mvc,Linq To Sql,这有点离谱,但我有一个客户对象返回到我的控制器。我想把这个对象重新连接回数据库,这可能吗?我知道存在datacontext.customers.insertonsubmit(客户),但是否存在等效的datacontext.customers.updateonsubmit(客户)???您希望在数据上下文的customers表上使用attach方法 datacontext.customers.Attach(customer); 将其重新连接到数据上下文。然后可以使用SubmitChanges()更

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

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

datacontext.customers.Attach(customer);
将其重新连接到数据上下文。然后可以使用
SubmitChanges()
更新数据库中的值


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

您在表单中发布的客户将没有实体键,因此可能无法很好地附加,此外,表单上可能没有客户的所有字段,因此可能无法设置所有字段

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

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

    TryUpdateModel(updateCustomer, "Customer", form);

    _Repository.Save(updateCustomer);
}

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

这就是我不喜欢LINQ到SQL的原因

如果在同一范围内进行查询和更新,它通常可以正常工作,但是如果您获取一个对象,缓存它,然后稍后尝试更新它,则无法进行

以下是文档中的内容:

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

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

datacontext.customers.Attach(customer);
有点模棱两可,特别是关于“序列化”和“反序列化”的确切含义

另外,有趣的是,下面是关于DataContext对象的说明:

通常,DataContext实例是 设计寿命为一个“单位 工作“无论应用程序如何定义 这个术语。数据上下文是 重量轻,使用成本不高 创造。典型的LINQ到SQL 应用程序创建数据上下文 方法范围内的实例或作为 短期类的成员 表示一组逻辑上相关的 数据库操作

因此,DataContext的作用域是严格的,但要使用Attach(),必须使用查询对象的同一DataContext。我假设/希望我们都完全误解了Attach()的真正用途


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

上一次(几个月前)我运行此操作时,此语句总是出错。关于(解释)“此对象最初附加到另一个数据上下文”的内容,但无法附加…最近发生了变化吗是的,很抱歉,我也遇到了这个问题,而不是答案。您必须将其与旧数据上下文分离。这仅仅涉及序列化和反序列化。如果您不介意对数据库进行额外的查询,您可以按照@Odd的建议重新查询模型,并使用UpdateModel(或TryUpdateModel)应用更改。事实上,这就是我所做的。请看以下博文: