如何解决Apress Pro Asp.net MVC Framework 3-SportsStore编辑产品不起作用?
| 一天了,有没有人购买Apress Pro Asp.net MVC Framework 3的ALPHA并创建了SportsStore?我一辈子都无法编辑产品并成功更新数据库吗?没有显示错误,并且单元测试全部功能正常,但是没有成功的“编辑”,即,我更改了一些详细信息,单击“保存”,它报告成功-然后检查结果,什么都没发生?在SportsStore工作时,还有其他人找到吗?任何建议将不胜感激。 干杯。解决方法
保存前需要更新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();
}
, 我还不能发表评论,但我想通过显示最终方法应为以下内容添加到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;
, 尝试以下方法。想法是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);
}
}
, 我使用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对象,而不是一个一个地编辑每个属性?
, 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();
}
, 尝试这个
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上下文的产品对象
, 这是答案
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。