Самый эффективный способ обновить с LINQ к SQL

Я могу обновить свою запись сотрудника, как дали в функции ниже, или я должен сделать запрос набора сотрудника сначала и затем обновить данные?

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

Но я не хочу использовать вторую опцию. Там какой-либо эффективный путь состоит в том, чтобы обновить данные?

Я получаю эту ошибку при помощи обоих путей:

Попытка была предпринята, чтобы Присоединить или Добавить объект, который не является новым, возможно, будучи загруженным из другого DataContext. Это не поддерживается.

22
задан Pranay Rana 16 February 2012 в 12:18
поделиться

3 ответа

Я нахожу следующее решение этой проблемы:

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<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) используйте отметку времени в столбце

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

5) Создайте хранимую процедуру для обновления ваших данных и вызовите ее с помощью контекста базы данных

9
ответ дан 29 November 2019 в 05:46
поделиться

На эту тему есть обсуждение здесь на MSDN с рекомендуют использовать поле IsVersion и метод Attach

2
ответ дан 29 November 2019 в 05:46
поделиться

Вы не можете присоединить измененную сущность к DataContext, если нет столбца RowVersion. Вместо этого вы можете хранить исходную сущность в вашем приложении, пока сохраняется копия для изменений данных. Затем, когда необходимо сохранить изменения, вы можете присоединить исходную сущность к DataContext, изменить ее значения в соответствии со значениями измененной сущности и отправить изменения.

Вот пример:

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

Обновление:

В базе данных есть таблица с колонками ID, Name, Notes

// 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
ответ дан 29 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: