1

我一直在阅读并关注 Freeman A. 和 Sanderson S. 所著的“Pro ASP.Net MVC3 Framework 第三版”一书。

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

我有一个页面可以编辑商店中的商品。很基本。当我更改页面中的值并提交它们时,它们会以应有的方式使用新值到达我的存储库的实现。

现在,这本书在我的存储库(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 中更新的东西吗?(这本书是不是有点过时了?)因为我可以用 if's 编码来分别检查所有的值,但我不禁觉得这取消了 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();
    }

我想这是一种正确的方法吗?对不起这个无用的问题:)

4

1 回答 1

2

问题是你的实体没有被跟踪EFDbContext,所以当你打电话时context.SaveChanges();,它不知道它需要更新它。

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

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

context.Products.Attach(product);
context.Entry(product).State = EntityState.Modified;
于 2012-07-23T05:02:54.253 回答