Asp.net mvc 使用MVC框架RC1更新断开连接的LINQ对象
这有点离谱,但我有一个客户对象返回到我的控制器。我想把这个对象重新连接回数据库,这可能吗?我知道存在datacontext.customers.insertonsubmit(客户),但是否存在等效的datacontext.customers.updateonsubmit(客户)???您希望在数据上下文的customers表上使用attach方法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.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)应用更改。事实上,这就是我所做的。请看以下博文: