7

通过 C# 使用 asp.net 4。

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

我以前使用过 SubSonic,它非常棒,因为它有活动记录,并且知道如果我加载了一条记录,更改了一些条目然后再次保存它,它会将其识别为更新,并且不会尝试在数据库中保存新条目.

我不知道如何在 LINQ 中做同样的事情。结果我的工作流程是这样的:

  1. 网页从数据库中获取“记录 A”
  2. 其中的一些值由用户更改。
  3. “记录 A”被传回数据访问层
  4. 我现在需要再次加载记录 A,将其称为“SavedRecord A”,使用传递的“记录 A”中的值更新此对象中的所有值,然后更新/保存“SavedRecord A”!

如果我只是保存“记录 A”,我最终会在数据库中获得一个新条目。

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

RecordA.Update();

我假设我在这里遗漏了一些东西,但我无法在网上找到一个简单的答案。

4

3 回答 3

2

您可以使用实例上的Attach方法完成您想要的,并通过.TableSubmitChanges()DataContext

这个过程可能不像我们希望的那样简单,但您可以阅读 David DeWinter 的LINQ to SQL:更新实体以获得更深入的解释/教程。

于 2012-07-02T15:13:34.013 回答
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 将从服务器获取这些实体,比较它们,并将不同的实体标记为更新

于 2012-07-02T15:23:26.670 回答
1

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

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

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

于 2012-07-02T15:32:29.287 回答