Картинка блога

В сети можно встретить большое количество дискуссий о проблеме обновления записи с помощью 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

Метки:,

3 комментария в “Метод SaveOrUpdate для Linq to SQL.”

  1. незнаю незнаю

  2. futureFAvorit32
    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;
    }

  3. futureFAvorit32
    9 июля, 2011 at 15:13

    Точнее:
    customer.Value = «v»;
    context.SubmitChanges();