代码之家  ›  专栏  ›  技术社区  ›  empz

如何避免在网站上编辑linqtosql对象时两次加载它

  •  0
  • empz  · 技术社区  · 16 年前

    我知道你们都厌倦了Linq到Sql的问题,但我几乎没有开始使用它(以前从未使用过ORM),而且我已经发现了一些“丑陋”的东西。我已经习惯了ASP.NETWebForms的旧式开发,但是我想把它抛在脑后,学习新的东西(我刚刚开始读一本ASP.NETMVC的书和一本.NET3.5/4.0的书)。

    所以有一件事我不喜欢,我找不到好的替代品。

    在大多数编辑LINQ对象的示例中,我看到对象首先被加载(命中db)以填充表单页上的当前值。然后,用户修改一些字段,当单击“保存”按钮时,第二次加载对象,然后更新。

    下面是一个简化的ScottGu NerdDinner站点示例。

    //
    // GET: /Dinners/Edit/5
    
    [Authorize]
    public ActionResult Edit(int id) {
    
        Dinner dinner = dinnerRepository.GetDinner(id);
    
        return View(new DinnerFormViewModel(dinner));
    }
    
    //
    // POST: /Dinners/Edit/5
    
    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection collection) {
    
        Dinner dinner = dinnerRepository.GetDinner(id);
    
        UpdateModel(dinner);
    
        dinnerRepository.Save();
    
        return RedirectToAction("Details", new { id=dinner.DinnerID });
    }
    

    如您所见,每次修改都会加载两次dinner对象。除非我遗漏了关于linqtosql缓存最后查询的对象之类的东西,否则我不喜欢两次得到它,因为它应该只被检索一次,修改然后返回到数据库。

    再说一遍,我真的错过了什么吗?或者它真的两次击中数据库(在上面的例子中,它不会造成伤害,但是在某些情况下,获取一个对象或一组对象可能是很重的事情)。

    如果是这样的话,您认为避免双重加载对象的最佳选择是什么?

    非常感谢你,

    3 回复  |  直到 16 年前
        1
  •  1
  •   Peter Willis    16 年前

    Web应用程序已断开连接,每个请求都是单独的。每个MVC控制器方法都是一个web请求,在您展示的示例中,请求之间不传输任何状态。无法判断从值的初始加载到post submit编辑值之间是否经过了很多时间。如果另一个用户在初始加载和编辑之间删除了晚餐呢。

    通过使用cookies和session等各种选项,可以在web请求之间传输状态数据。要实现所描述的内容,需要将对象存储在请求范围之外。这样可以避免第二次调用“GetDinner”。在ASP.NET MVC中,这是通过使用 TempData

        2
  •  0
  •   Frank Schwieterman    16 年前

    我认为在linqtosql中没有办法避免这种情况。。。在更新数据之前,您总是需要先输入数据。

    在很多情况下,这没关系,因为写和读相比是非常罕见的。如果您发现某个特定的写操作正在成为性能问题,您可以随时退回到使用存储过程。

        3
  •  0
  •   Devart    16 年前

    您可以创建一个Dinner实体的实例,填写属性,然后调用Attach(Dinner,true)来传递修改后的实体,它将在数据库中更新。

    如果已将设计器中实体的所有属性的UpdateCheck设置为Never,则可以实现在更新实体时不执行数据库查询的情况。

    推荐文章