我买了一本关于MVC 3的书。在本书中,有一个实现编辑方法的例子。以下是代码:
[HttpPost]
public ActionResult Edit(Product product) {
if (ModelState.IsValid) {
TryUpdateModel(product);
repository.SaveProduct(product);
return RedirectToAction("Index");
} else {
// there is something wrong with the data values
return View(product);
}
}
此代码非常适合创建新产品,但不适用于现有产品的版本。
我更新了成功编辑产品的代码(请参阅下面的代码):
[HttpPost]
public ActionResult Edit(Product prod)
{
if (ModelState.IsValid)
{
Product product = repository.Products.FirstOrDefault(p => p.ProductID == prod.ProductID);
TryUpdateModel(product);
repository.SaveProduct(product);
return RedirectToAction("Index");
}
else
{
// there is something wrong with the data values
return View(prod);
}
}
修改
以下是Saveproduct方法:
public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
context.SaveChanges();
}
正如您所看到的,我在代码中所做的修改是基于他的ID检索产品,然后保存产品。
我的问题:为什么第二种方法有效而不是第一种?在第二种方法中,为什么我们必须从存储库中检索产品?
感谢。
答案 0 :(得分:1)
您不需要额外的TryUpdateModel
方法调用,因为当您将模型作为Edit
方法中的参数接收时,MVC已经更新了模型。
[HttpPost]
public ActionResult Edit(Product product) {
if (ModelState.IsValid) {
repository.SaveProduct(product);
return RedirectToAction("Index");
} else {
// there is something wrong with the data values
return View(product);
}
}
您的SaveProduct
方法无法正确处理分离实体的编辑。
public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
else
{
var entry = context.Entry(product);
entry.State = EntityState.Modified;
}
context.SaveChanges();
}
答案 1 :(得分:1)
Creating an EF Data Model解释了所有这些
答案 2 :(得分:0)
区别在于上下文知道内存中的实体与磁盘上的数据之间的连接。
当你将一个实体放入你的一个方法时,上下文对它一无所知。所以它无法保存它。如果从数据库中提取行并更新它,则上下文知道它已更新并可以保存它。
您可以做的另一件事是将传入的实体附加到上下文。