System.Web.MVC.UpdateModel可以更新EF导航属性吗?

时间:2009-05-19 22:04:45

标签: asp.net-mvc entity-framework

如果我的数据库中有2个表: Foo bar Foo FooId 标识, BarId 标识符。 Bar 可以有0到多个 Foos 因此Foo将 BarId 作为外键。

我有一个代表这个的模型和一个可以用来编辑 Foo 的视图,并选择(从下拉列表中)相关的 Bar

在控制器上给出以下方法:

[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 的调用会抛出 InvalidOperationException 而不会出现 InnerException

The model of type 'TestApplication.Models.Foo' was not successfully updated.

我的控制器从我的视图中的下拉列表更新基于实体框架的模型的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

不,默认模型绑定器无法执行此操作。你也很难写一个自定义模型绑定器来做到这一点。 HTML SELECT元素仅在描述中存储ID值,不足以实现大多数实体实例。所以我们只需要处理这样一个事实:我们只会获得一个ID,这不足以实现一个实体而不会访问数据库。

因此,在更新实体的导航属性时,我们有两个选择:

  1. 从数据库中读入实体并将其分配给控制器中的导航属性。
  2. 不要尝试为导航属性实现实体; instead just assign the EntityKey
  3. 后者就是我所做的。您可以在自定义模型绑定器或控制器中执行此操作。您可以阅读更多关于在链接中执行此操作的内容,并且在该链接的注释中有一些示例代码。

    即将推出的.NET 4.0中新版本的Entity Framework将有一个名为“FK Associations”的新功能,这将使这一过程变得相当容易。