我一直在阅读并关注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();
}
我想这是一种正确的方法吗?抱歉无用的问题:)
答案 0 :(得分:1)
问题是您的EFDbContext
未跟踪该实体,因此当您致电context.SaveChanges();
时,它不知道它需要更新它。
因此,您需要确保上下文知道跟踪实体的状态。
基本上有两种方法可以执行此操作 - 您在第二次编辑中列出的方式,或者您可以手动将实体“附加”到上下文并将其标记为已修改,如下所示:
context.Products.Attach(product);
context.Entry(product).State = EntityState.Modified;