В сети можно встретить большое количество дискуссий о проблеме обновления записи с помощью LINQ. У каждого есть свое решение, но все сводится к тому, что метод Attach в классе DataContext работает, мягко говоря, не совсем так как должен.
Например следующий кусок кода может сильно разочаровать:
public bool Update(tt_customer customer){
context = new TimeTrakkerContext();tt_customer Tcust = context.tt_customers.Single(c => c.Pk == customer.Pk);
context.tt_customers.Attach(customer, Tcust);
context.SubmitChanges();return true;
}
Вполне вероятно, что метод Attach выбросится со следующей ошибкой: Cannot add an entity with a key that is already in use.
Все это выглядит странно, особенно после того, что этот метод должен именно обновлять, а не добавлять запись. Следующие варианты тоже работать не будут
- context.tt_customers.Attach(customer, true);
- An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.
- context.tt_customers.Attach(customer);
customer.Address = customer.Address;: Cannot add an entity with a key that is already in use.
: context.tt_customers.Attach(customer); - Просто ничего не сделает
Нашим решением является Reflection. Мы просто обновляем все свойства старого объекта из нового.
var originalEntity = dc.GetTable().Where(x => x.id== newEntity.id).SingleOrDefault();foreach (var property in newEntity.GetType().GetProperties())
{
PropertyInfo orignProperty = originalEntity.GetType().GetProperty(property.Name);
orignProperty.SetValue(originalEntity, property.GetValue(newEntity, null), null);
}dc.SubmitChanges();
Источник LINQ to SQL and attaching Entities
Метки:C#, разработка
Похожие статьи
- 4 февраля 2009 -- LINQ Insert or Update еще одно решение. (2)
- 30 декабря 2008 -- Создаем ASHX хендлер в ASP.NET (1)
- 31 августа 2009 -- CRUD на SQLite (5)
- 12 февраля 2009 -- Мультипоточность в Windows.Forms и WPF (6)
- 11 декабря 2008 -- Генерация Entity классов с помощью MSSQL. (3)
2 марта, 2010 at 17:50
незнаю незнаю
9 июля, 2011 at 15:10
Прсто меняем значение и сохраняем изменения
public bool Update(tt_customer customer)
{
context = new TimeTrakkerContext();
tt_customer Tcust = context.tt_customers.Single(c => c.Pk == customer.Pk);
// context.tt_customers.Attach(customer, Tcust);
context.SubmitChanges();
return true;
}
9 июля, 2011 at 15:13
Точнее:
customer.Value = «v»;
context.SubmitChanges();