如果我的数据库中有 2 个表:Foo 和 bar。 富 由 FooId 和 标识酒吧 是 BarId 的标识符。一个 Bar 可以有 0 到多个 Foo,因此 Foo 有 BarId 作为外键。
我有一个代表这个的模型和一个可用于编辑 Foo 并选择(从下拉列表中)关联的 Bar 的 View 。
给定 Controller 上的以下方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formCollection)
{
Foo originalFoo = FooById(id);
if (!ModelState.IsValid)
{
return View(new VenueViewModel(originalVenue, _db.GetCounties(), _db.VenueTypeSet));
}
UpdateModel(originalFoo);
/* Instead of using UpdateModel I could just iterate through
formCollection and manually update originalFoo, it would
work but surely there is a better way? */
_db.SaveChanges();
return RedirectToAction("Index");
}
对 UpdateModel 的调用会引发没有 InnerException 的 InvalidOperationException:
The model of type 'TestApplication.Models.Foo' was not successfully updated.
我的 Controller 从 View 中的下拉列表中更新基于 Entity Framework 的模型的正确方法是什么?
最佳答案
不,默认模型绑定(bind)器无法执行此操作。您也很难编写自定义模型绑定(bind)器来执行此操作。 HTML SELECT 元素只会在描述中存储一个 ID 值,不足以实现大多数实体实例。所以我们只需要处理我们将仅获得一个 ID 的事实,这不足以在不访问数据库的情况下实现实体。
因此,在更新实体的导航属性时,我们有两种选择:
后者是我所做的。您可以在自定义模型绑定(bind)器或 Controller 中执行此操作。您可以在链接中阅读更多有关执行此操作的信息,并且我在该链接的评论中有一些示例代码。
即将推出的 .NET 4.0 中的新版本 Entity Framework 将具有一个名为“FK 关联”的新功能,这将大大简化此操作。
关于asp.net-mvc - System.Web.MVC.UpdateModel 可以更新 EF 导航属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885270/