EF 4中的ApplyCurrentValues

时间:2010-02-16 11:01:55

标签: .net entity-framework visual-studio-2010

我刚刚在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();

        }

    }

任何想法或更好的解决方法?

2 个答案:

答案 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();
    }
}