代码之家  ›  专栏  ›  技术社区  ›  Al Katawazi

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

  •  5
  • Al Katawazi  · 技术社区  · 17 年前

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

    3 回复  |  直到 17 年前
        1
  •  0
  •   tvanfosson    17 年前

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

    datacontext.customers.Attach(customer);
    

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

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

        2
  •  5
  •   Daniel Schaffer    17 年前

    这是我不喜欢Linq to SQL的地方。

    如果您在同一个范围内查询和更新,它通常工作得很好,但是如果您得到一个对象,缓存它,然后稍后再尝试更新它,则不能。

    文件上写着:

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

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

    有点模棱两可的imho,特别是关于“序列化”和“反序列化”的确切含义。

    另外,有趣的是,它对DataContext对象的描述如下:

    通常,DataContext实例是 设计用于一个“单位 “无论应用程序如何定义 那个词。数据上下文是 重量轻,不贵 创造。典型的Linq to SQL 应用程序创建数据上下文 方法范围内的实例或作为 短期阶级的成员 表示相关的逻辑集 数据库操作。

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

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

        3
  •  3
  •   Odd    17 年前

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

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

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

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