LINQ to SQL - 更新记录

时间:2012-07-02 15:06:58

标签: asp.net sql linq

使用asp.net 4虽然是C#。

在我的数据访问层中,我有保存和更新记录的方法。保存很容易,但更新很乏味。

我之前使用的SubSonic很棒,因为它有活动记录,并且知道如果我加载了一条记录,更改了一些条目然后再次保存,它就会认为它是一个更新并且没有尝试保存新条目在DB。

我不知道如何在LINQ中做同样的事情。因此,我的工作流程如下:

  1. 网页从数据库中抓取“记录A”
  2. 用户可以更改其中的某些值。
  3. '记录A'被传递回数据访问层
  4. 我现在需要再次加载Record A,称之为'SavedRecord A',使用传递的'Record A'中的值更新此对象中的所有值,然后更新/保存'SavedRecord A'!
  5. 如果我只保存'记录A',我最终会在数据库中输入一个新条目。

    显然,通过记录A并执行以下操作会更好:

    RecordA.Update();
    

    我认为我在这里缺少一些东西,但我无法在网上找到直截了当的答案。

3 个答案:

答案 0 :(得分:2)

您可以使用Table实例上的Attach method完成所需内容,并通过SubmitChanges()上的DataContext方法提交。

此过程可能不像我们希望的那样直截了当,但您可以阅读David DeWinter的LINQ to SQL: Updating Entities以获得更深入的解释/教程。

答案 1 :(得分:2)

假设你有一个产品类OR DB,那么你必须这样做。

    DbContext _db = new DbContext();

    var _product = ( from p in _db.Products
                                    where p.Id == 1  // suppose you getting the first product
                                    select p).First();  // this will fetch the first record.

     _product.ProductName = "New Product";

     _db.SaveChanges();

      // this is for EF LINQ to Objects
     _db.Entry(_product).State = EntityState.Modified;  
     _db.SaveChanges();

-------------------------------------------------------------------------------------
this is another example using Attach
-------------------------------------------------------------------------------------

public static void Update(IEnumerable<Sample> samples , DataClassesDataContext db)
{
    db.Samples.AttachAll(samples);
    db.Refresh(RefreshMode.KeepCurrentValues, samples)
    db.SubmitChanges();
}

如果您将实体附加到上下文然后刷新(选择了KeepCurrentValues),Linq to SQL将从服务器获取这些实体,比较它们,并标记更新的那些不同的实体

答案 2 :(得分:1)

当LINQ-to-SQL更新数据库中的记录时,它需要确切地知道哪些字段已更改,以便仅更新这些字段。你基本上有三个选择:

  • 当更新的数据发布回Web服务器时,从数据库加载现有数据,将所有属性分配给加载的对象并调用SubmitChanges()。任何分配了现有值的属性都不会更新。
  • 跟踪对象的未修改状态,并对未修改和修改的值使用Attach
  • 使用乐观并发检查所需的所有状态初始化一个新对象(如果启用,默认情况下是这样)。然后附加对象,最后在附件后更新任何已更改的属性,以使DataContext更改跟踪器知道更新的那些。

我通常使用第一个选项,因为它最简单。两个数据库调用会导致性能下降,但除非您进行大量更新,否则无关紧要。