G'day All,有没有人购买了Apress Pro Asp.net MVC Framework 3的ALPHA并创建了SportsStore?我不能为我的生活编辑产品并成功更新数据库?没有显示错误,单元测试全部运行,但没有成功“编辑”,即我更改了一些细节,点击保存,报告成功 - 然后检查结果,什么也没发生?通过SportsStore工作时有没有其他人发现这个?任何建议将不胜感激。
干杯。
答案 0 :(得分:12)
在保存之前,需要更新EF对象的状态。
public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
else
{
context.Entry(product).State = System.Data.EntityState.Modified;
}
int result = context.SaveChanges();
}
答案 1 :(得分:3)
我还不能发表评论,但我想通过展示你的最终方法应该阅读的内容来添加MVC Newbie的评论:
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
context.Products.Add(product);
} else {
context.Entry(product).State = EntityState.Modified;
}
int numSaved = context.SaveChanges();
}
另外不要忘记添加额外的using语句(再次提到MVC Newbie):
//using system.data;
答案 2 :(得分:1)
尝试以下方法。想法是产品参数,MVC模型绑定到Action方法不与EF同步,所以我们需要将它与存储库相关联:
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
((ObjectSet<Product>)repository.Products).ApplyCurrentValues(product);
repository.SaveProduct(product);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
答案 3 :(得分:0)
我使用Apress Pro ASP.NET MVC3的最终版本遇到了同样的问题。使用Visual Studio调试器时,我注意到执行context.SaveChanges()
(SportsStore.Domain.Concrete.EFProductRepoistory)时,上下文未更改为我们在“编辑”视图中所做的更改。虽然产品在SaveProduct()
所以我猜我们要做的就是将Context.Products.Product更改为构造函数中的产品,如下所示:
else
{
context.Products.Find(product.ProductId) = product;
}
不幸的是,Visual Studio给了我这个错误:
错误1作业的左侧必须是变量,属性或索引器
为了使它成功,我必须这样做:
else
{
context.Products.Find(product.ProductID).Name = product.Name;
context.Products.Find(product.ProductID).Description = product.Description;
context.Products.Find(product.ProductID).Category = product.Category;
context.Products.Find(product.ProductID).Price = product.Price;
}
这确实有效。但是我认为这远非理想,而不是最好的方法。
有没有办法以我在上下文中编辑/更新整个Product对象而不是逐个编辑每个属性的方式来执行此操作?
答案 4 :(得分:0)
public void SaveProduct(Product product)
{
var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
if (product.ProductID > 0)
{
context.Products.Remove(prod);
}
context.Products.Add(product);
context.SaveChanges();
}
答案 5 :(得分:-1)
试试这个
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
Product p = repository.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
if (p != null)
{
p.ProductID = product.ProductID;
p.Price = product.Price;
p.Category = product.Category;
p.Description = product.Description;
p.Name = product.Name;
}
else
p = product;
repository.SaveProduct(p);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
我是mvc 3初学者,但我认为模型参考(产品参数)是一个未绑定到EF上下文的Product对象
答案 6 :(得分:-1)
以下是答案
public void SaveProduct(Product product)
{
var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
if (product.ProductID > 0)
{
context.Products.Remove(prod);
}
context.Products.Add(product);
context.SaveChanges();
}