65.9K
CodeProject 正在变化。 阅读更多。
Home

更新 LINQ to SQL 的最高效方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (5投票s)

2012年4月1日

CPOL

1分钟阅读

viewsIcon

48064

更新 LINQ to SQL 的最高效方法

这篇文章是关于我在一个社区网站上提出的问题以及我找到的最佳答案。 问题完全是关于使用 LINQ TO SQL 更新数据。 文章中的信息对可能对 LINQ to SQL ORM 中更新记录有疑问的初级开发人员有帮助。

这里我有一个关于更新员工数据的问题,这些数据是我为了显示给用户而获取的,然后更新员工信息,并将数据保存回数据库。

提问 

我可以使用下面函数中给出的方式更新我的员工记录,还是必须先查询员工集合,然后更新数据?

public int updateEmployee(App3_EMPLOYEE employee)
      {
          DBContextDataContext db = new DBContextDataContext();
          db.App3_EMPLOYEEs.Attach(employee);
          db.SubmitChanges();
          return employee.PKEY;
      }
或者我必须这样做?
public int updateEmployee(App3_EMPLOYEE employee)
    {
        DBContextDataContext db = new DBContextDataContext();
        App3_EMPLOYEE emp = db.App3_EMPLOYEEs.Single(e => e.PKEY == employee.PKEY);
        db.App3_EMPLOYEEs.Attach(employee,emp);
        db.SubmitChanges();
        return employee.PKEY;
    }
但我不想使用第二种方法。 是否有更有效的方法来更新数据? 我在使用这两种方法时都遇到了这个错误
An attempt has been made to Attach or Add an entity that is not new, 
perhaps having been loaded from another DataContext.  
This is not supported.

我通过谷歌搜索来获得问题的答案并解决问题,并从不同的网站和来源获得了以下答案。 因此,基于此,我得到了更新数据的以下 5 种方法。

答案 

我找到了解决此问题的以下方法

1) 获取并更新实体(我将使用这种方法,因为它对我来说可以接受)

public int updateEmployee(App3_EMPLOYEE employee)
    {
        AppEmployeeDataContext db = new AppEmployeeDataContext();
        App3_EMPLOYEE emp = db.App3_EMPLOYEEs.Single(e => e.PKEY == employee.PKEY);
        emp.FIRSTNAME = employee.FIRSTNAME;//copy property one by one 
        db.SubmitChanges();
        return employee.PKEY;
    }
2) 禁用 ObjectTrackingEnabled,如下所示
// but in this case lazy loading is not supported
       
    
        public AppEmployeeDataContext() : 
            base(global::LinqLibrary.Properties.Settings.Default.AppConnect3DBConnectionString, mappingSource)
          {
                    this.ObjectTrackingEnabled = false;
           OnCreated();
          }
3) 分离所有相关对象
partial class App3_EMPLOYEE
    {
        public void Detach()
        {
            this._APP3_EMPLOYEE_EXTs = default(EntityRef);
        }
    }

     public int updateEmployee(App3_EMPLOYEE employee)
    {
        AppEmployeeDataContext db = new AppEmployeeDataContext();
        employee.Detach();
        db.App3_EMPLOYEEs.Attach(employee,true);
        db.SubmitChanges();
        return employee.PKEY;
    }

4) 在列中使用时间戳 http://www.west-wind.com/weblog/posts/135659.aspx

5) 创建存储过程来更新数据并由 db 上下文调用

注意: 如果您有其他方法,请在评论中添加。 我已尝试将其包含在我的文章中。

在我的博客上找到文章: http://pranayamr.blogspot.in/2012/03/most-efficient-way-to-update-with-linq.html

© . All rights reserved.