Немного более простым решением было бы реализовать интерфейс ICloneable
на объекте, с которым вы хотели бы работать подобным образом. Затем все, что вам нужно сделать, это вызвать Clone () в «оригинальную» сущность, которую вы извлекли из БД.
Пример:
class Product : ICloneable
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public object Clone()
{
return new Product() { Id=this.Id, Name=this.Name };
}
}
И тогда все, что вам нужно сделать, это:
Datacontext db = new Datacontext(); // replace with your DataContext
Product originalProduct =
db.Products.Single(p => p.Id == 2); // get product with Id 2
db.originalProduct = p.Clone()
db.SubmitChanges();
Редактировать:
Я столкнулся с той же проблемой на работе, до сих пор самым элегантным решением, которое я нашел, было создание метода расширения, который получает вновь созданную сущность, в вашем случае Product
, и копирует ее свойства (кроме идентификатора) в сущность вы извлекли из DataContext.
Я скопировал все свойства с помощью Reflection, таким образом, если я обновлю сущность, тогда мой метод расширения будет работать.
Надеюсь, это вам тоже поможет.
Если вы найдете более элегантное решение этой проблемы, я хотел бы услышать:)