上下文不会更新

时间:2012-07-23 00:43:51

标签: asp.net-mvc-3

我一直在阅读并关注Freeman A.和Sanderson S的“Pro ASP.Net MVC3 Framework Third Edition”一书。

我已经到达了他们告诉我如何更新实体的部分。一切正常,但更新除外。

我有一个页面来编辑商店中的商品。很基本的。当我更改页面中的值并提交它们时,它们会按照新值继续实现我的存储库。

现在,本书向我展示了我的存储库(SaveProduct)中的以下方法:

namespace SportsStore.Domain.Concrete
{
    public class EFProductRepository : IProductRepository
    {
         private EFDbContext context = new EFDbContext();
    public IQueryable<Product> Products
    {
        get { return context.Products; }
    }
    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }
        context.SaveChanges();
    }
}
}

此方法有效,但不保存我的产品。我并没有完全掌握MVC3的模糊性,所以我被困住了。产品作为参数在SaveProduct方法中以适当的值到达,并且应该保存,但上下文不会更新。

这是在MVC3中更新的内容吗? (这本书有点过时吗?)因为我可以编写代码来分别检查所有值,但我不禁觉得这会取消MVC3 / Entity Framework的强大功能。

有人可以帮帮我吗?非常感谢! :)同时我会调试并寻找任何线索!

编辑:

当我捕获SaveChanges()返回的整数时,它似乎为零。所以我想具有新值的实体不会“更新”到实体框架。

编辑2:

我已经找到了问题(已经存在)。似乎我太急于提问,我为此道歉。这是我做的:

我将以下代码添加到方法SaveProduct:

    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }
        else
        {
            var productInDb = context.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
            context.Entry(productInDb).CurrentValues.SetValues(product);
        }
        context.SaveChanges();
    }

我想这是一种正确的方法吗?抱歉无用的问题:)

1 个答案:

答案 0 :(得分:1)

问题是您的EFDbContext未跟踪该实体,因此当您致电context.SaveChanges();时,它不知道它需要更新它。

因此,您需要确保上下文知道跟踪实体的状态。

基本上有两种方法可以执行此操作 - 您在第二次编辑中列出的方式,或者您可以手动将实体“附加”到上下文并将其标记为已修改,如下所示:

context.Products.Attach(product);
context.Entry(product).State = EntityState.Modified;