LINQ to SQL

通过C#使用asp.net 4。

在我的数据访问层,我有保存和更新记录的方法。 节省很简单,但更新很繁琐。

我以前使用过SubSonic,因为它有很好的记录,并且知道如果我加载了一条记录,改变了几条记录然后再保存它,它就认为它是一个更新,并没有试图在数据库中保存一个新记录。

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

  • 网页抓取数据库中的'记录A'
  • 用户可以更改其中的某些值。
  • '记录A'被传回数据访问层
  • 我现在需要再次加载记录A,调用它'SavedRecord A',用传入的'记录A'中的值更新此对象中的所有值,然后更新/保存'SavedRecord A'!
  • 如果我只保存'记录A',我最终会在数据库中添加一个新条目。

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

    RecordA.Update();
    

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


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

  • 当更新的数据回发到Web服务器时,从数据库加载现有数据,将所有属性分配给加载的对象并调用SubmitChanges() 。 任何分配了现有值的属性都不会被更新。
  • 跟踪对象的未修改状态,并使用Attach未修改和已修改的值同时使用。
  • 使用乐观并发检查所需的所有状态初始化一个新对象(如果启用,则默认为此状态)。 然后附加该对象,最后在连接后更新任何已更改的属性,以使DataContext更改跟踪器知道更新的内容。
  • 我通常使用第一个选项,因为它是最简单的。 有两个数据库调用会导致性能损失,但除非您正在进行大量更新,否则无关紧要。


    您可以使用Table实例上的Attach方法完成您想要的操作,并通过DataContext上的SubmitChanges()方法进行提交。

    这个过程可能并不像我们想的那样直截了当,但您可以阅读David DeWinter的LINQ to SQL:更新实体以获取更深入的解释/教程。


    假设你有一个产品类或数据库,那么你将不得不这样做。

        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将从服务器获取这些实体,对它们进行比较,并标记更新的实例

    链接地址: http://www.djcxy.com/p/61003.html

    上一篇: LINQ to SQL

    下一篇: Not sure how to join tables using Fluent NHibernate