ASP.NET MVC 4 - 编辑时如何使用viewmodel&坚持数据

时间:2013-06-05 05:20:28

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

mvc 4使用sql server 2008,代码优先,ef5

我有一个与视图相关联的ViewModel。

作为起点,我正在修改由VS创建的脚手架。

我可以填写表格。

当用户点击“保存”时 - 这是脚手架中的代码:

 [HttpPost]
 public ActionResult Edit(Place place)
 {
 if (ModelState.IsValid)
    {
       db.Entry(place).State = EntityState.Modified;
       db.SaveChanges();
       return RedirectToAction("Index");
    }
 return View(place);

地方是模特。我需要将viewmodel(包括地点)传递给它。

如何使用EF将viewmodel保存在数据库中?我是否必须先将其拆分为模型?

当我尝试时,我收到此错误:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

当我调试它时,似乎PlaceID(来自模型)在传递回控制器httpPost Edit控制器的模型中缺失 - 也许这是错误的来源?

有没有在线最佳实践的例子 - 我找不到任何东西。

感谢。

2 个答案:

答案 0 :(得分:6)

  

如何使用EF将视图模型保存在数据库中?

您不会在数据库中保留视图模型。他们的角色不是坚持不懈的。视图模型用于定义视图使用的逻辑。您可以在控制器操作中将视图模型映射回您的域模型,该模型将使用您选择的数据访问技术进行持久化。您可以使用AutoMapper在视图模型和域模型之间进行映射。

  

当我调试它时,似乎缺少PlaceID(来自模型)   传回控制器httpPost Edit的模型   控制器 - 也许这是错误的来源?

是的,这是可能的原因。如果要更新数据库中的某些记录,EF需要知道哪个是使用ID的记录。

答案 1 :(得分:1)

视图中缺少这个:

@ Html.HiddenFor(model => model.place.PlaceID)

这会密切关注模型的ID