- Хроники. - -

Метод SaveOrUpdate для Linq to SQL.

Posted By Ikutsin On 15 октября 2008 @ 9:54 In .NET C#,MSSQL | Comments Disabled

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


Article printed from Хроники.:

URL to article: /157-metod-saveorupdate-dlya-linq-to-sql

URLs in this post:

[1] LINQ to SQL and attaching Entities: http://www.west-wind.com/weblog/ShowPost.aspx?id=134095

Copyright © 2008 Все, что меня окружает. All rights reserved.