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

Al *_*azi 5 asp.net-mvc linq-to-sql

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

Dan*_*fer 5

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

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

这是文档说的内容:

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

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

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

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

通常,DataContext实例设计为持续一个"工作单元",但是您的应用程序定义该术语.DataContext是轻量级的,创建起来并不昂贵.典型的LINQ to SQL应用程序在方法范围内创建DataContext实例,或者作为表示相关数据库操作的逻辑集的短期类的成员.

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

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


tva*_*son 0

您想要在数据上下文的客户表上使用 Attach 方法。

datacontext.customers.Attach(customer);
Run Code Online (Sandbox Code Playgroud)

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

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