我刚刚在VS 2010 RC中玩EF 4,刚发现当属性类型为bool并且新值为false时,ApplyCurrentValues不起作用!!!
并且它在新值为真时起作用。
我不知道这是一个错误还是我错过了一些东西,但我只是在处理一个非常丑陋的工作:
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();
}
}
任何想法或更好的解决方法?
答案 0 :(得分:20)
您附加了一个新的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();
}
}
即使你不喜欢这样,试试看它是否有效。
现在在我看来,您正试图避免首先加载产品。但这样做会破坏你的代码。因此,虽然我质疑尝试“优化”更新(您在这里加载一条记录,并且更新发生的次数少得多,然后选择),让我们同意从一些有用的东西开始。
如果这样做,它会告诉您如果您坚持不加载产品以进行更新需要执行的操作:您需要mark all properties as modified。
答案 1 :(得分:1)
修改:
public void UpdateProduct(Product updatedProduct)
{
using (model)
{
model.Products.Single(p => p.ProductID == updatedProduct.ProductID);
model.Products.ApplyCurrentValues(updatedProduct);
model.SaveChanges();
}
}