Я просто играл с EF 4 в VS 2010 RC и обнаружил, что ApplyCurrentValues не работает, когда свойство имеет тип bool, а новое значение равно false !!! ???
и это работает, когда новое значение истинно.
Я не знаю, является ли это ошибкой, или я что-то упускаю, но я просто работаю с очень уродливым решением:
public void UpdateProduct(Product updatedProduct)
{
using (model)
{
model.Products.Attach(new Product { ProductID = updatedProduct.ProductID });
model.Products.ApplyCurrentValues(updatedProduct);
Product originalProduct = model.Products.Single(p => p.ProductID == updatedProduct.ProductID);
originalProduct.Discontinued = updatedProduct.Discontinued;
model.SaveChanges();
}
}
Любая идея или лучше обойти?
Вы добавили новый Product
со значениями по умолчанию для всех свойств bool (false). Затем вы устанавливаете одно из этих значений false. Не удивительно, что это не обновляет; Вы фактически не изменили это! Мне кажется, вы могли бы решить эту проблему, удалив часть кода:
public void UpdateProduct(Product updatedProduct)
{
using (model)
{
Product originalProduct = model.Products.Single(p => p.ProductID == updatedProduct.ProductID);
model.Products.ApplyCurrentValues(updatedProduct);
model.SaveChanges();
}
}
Даже если вам не нравится это, попробуйте и посмотрите, работает ли это.
Теперь мне кажется, что вы пытаетесь избежать загрузки продукта в первую очередь. Но это нарушило ваш код. Поэтому, хотя я задаюсь вопросом, пытаясь «оптимизировать» обновление (вы загружаете одну запись здесь, а обновления происходят гораздо реже, чем выбирает), давайте согласимся начать с чего-то, что работает.
Если это работает, он говорит вам, что вам нужно сделать, если вы настаиваете на том, чтобы не загружать продукт для обновления: вам нужно пометить все свойства как измененные .
Изменен:
public void UpdateProduct(Product updatedProduct)
{
using (model)
{
model.Products.Single(p => p.ProductID == updatedProduct.ProductID);
model.Products.ApplyCurrentValues(updatedProduct);
model.SaveChanges();
}
}