使用LINQ to SQL进行更新的最有效方法

[英]Most efficient way to update with LINQ to SQL


Can I update my employee record as given in the function below or do I have to make a query of the employee collection first and then update the data?

我可以更新下面函数中给出的员工记录,还是首先要查询员工集合,然后更新数据?

  public int updateEmployee(App3_EMPLOYEE employee)
  {
      DBContextDataContext db = new DBContextDataContext();
      db.App3_EMPLOYEEs.Attach(employee);
      db.SubmitChanges();
      return employee.PKEY;
  }

Or do I have to do the following?

或者我必须做以下事情?

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;
}

But I don't want to use the second option. Is there any efficient way to update data?

但我不想使用第二种选择。有没有有效的方法来更新数据?

I am getting this error by using both ways:

我通过两种方式得到此错误:

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.

已尝试附加或添加非新的实体,可能已从另一个DataContext加载。这不受支持。

6 个解决方案

#1


9  

I find following work around to this problem :

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

1) fetch and update entity (I am going to use this way because it's ok for me )

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) disable ObjectTrackingEnabled as following

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) Detach all the related objects

3)分离所有相关对象

partial class App3_EMPLOYEE
{
    public void Detach()
    {
        this._APP3_EMPLOYEE_EXTs = default(EntityRef<APP3_EMPLOYEE_EXT>);
    }
}

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

4) use Time stamp in the column

4)在列中使用时间戳

 http://www.west-wind.com/weblog/posts/135659.aspx

5) Create stored procedure for updating your data and call it by db context

5)创建用于更新数据的存储过程,并通过db上下文调用它

#2


3  

You cannot attach a modified entity to a DataContext when there is no RowVersion column. Instead you could store original entity in your application as long as maintaining a copy for data changes. Then when changes need to be saved you could attach original entity to a DataContext, change its values to match the modified entity values and submit changes.

如果没有RowVersion列,则无法将修改后的实体附加到DataContext。相反,只要维护数据更改的副本,您就可以将原始实体存储在应用程序中。然后,当需要保存更改时,您可以将原始实体附加到DataContext,更改其值以匹配修改后的实体值并提交更改。

Here is an example:

这是一个例子:

public int updateEmployee(App3_EMPLOYEE employee, App3_EMPLOYEE originalEmployee)
{
    DBContextDataContext db = new DBContextDataContext();
    db.App3_EMPLOYEEs.Attach(originalEmployee);

    // TODO: Copy values from employee to original employee

    db.SubmitChanges();
    return employee.PKEY;
}

Update:

更新:

There is a table in the database with columns ID, Name, Notes

数据库中有一个表,其中包含列ID,名称,注释

// fetch an employee which will not be changed in the application
Employee original;
using(var db = new TestDbDataContext())
{
  original = db.Employees.First(e => e.ID == 2);
}

// create an instance to work with
var modified = new Employee {ID = original.ID, Name = original.Name, Notes = original.Notes};

// change some info
modified.Notes = string.Format("new notes as of {0}", DateTime.Now.ToShortTimeString());  
// update
using(var db = new TestDbDataContext())
{
  db.Employees.Attach(original);
  original.Notes = modified.Notes;
  db.SubmitChanges();
}

#3


2  

There is a discussion on this topic here at MSDN s recommend you to use an IsVersion field and the Attach method

这里有关于此主题的讨论,MSDN建议您使用IsVersion字段和Attach方法

#4


2  

You can attach a unattached modified entity, by using this overload:

您可以使用此重载附加未附加的已修改实体:

db.App3_EMPLOYEEs.Attach(employee, true);//Attach as modfieied

Note that for this to work you need in your table a "Version" column of type "timestamp"

请注意,要使其正常工作,您需要在表中添加“timestamp”类型的“Version”列

#5


0  

This is a function in my Repository class which I use to update entities

这是我的Repository类中的一个函数,我用它来更新实体

protected void Attach(TEntity entity)
{
   try
    {
       _dataContext.GetTable<TEntity>().Attach(entity);
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
    catch (DuplicateKeyException ex) //Data context knows about this entity so just update values
    {
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
}

Where TEntity is your DB Class and depending on you setup you might just want to do

TEntity是您的数据库类,根据您的设置,您可能只想这样做

_dataContext.Attach(entity);

#6


0  

Use this extend method for update all properties that are column attributes:

使用此extend方法更新作为列属性的所有属性:

public static void SaveToOriginal<T>(this T original, T actual)
    {
        foreach (var prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Where(info => info.GetCustomAttribute<System.Data.Linq.Mapping.ColumnAttribute>() != null))
        {
            prop.SetValue(original, prop.GetValue(actual));
        }
    }

I mean, first you recover the original from database, use the method to map all columns attributes from new element to original, and at last do a submit. I hope this helps.

我的意思是,首先从数据库中恢复原始数据,使用该方法将所有列属性从新元素映射到原始元素,最后进行提交。我希望这有帮助。

智能推荐

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:http://www.itdaan.com/blog/2010/05/20/8cd99293088cbd72bbe8a7228c9cd2d1.html



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告