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

Iai*_*ain 4 asp.net-mvc entity-framework

如果我的数据库中有2个表:Foobar.FooFooId标识,BarBarId的标识符.一个Bar可以有0到多个Foos,因此Foo有BarId作为外键.

我有一个代表这个的模型和一个可用于编辑Foo并从关联栏中选择(从下拉列表中)的视图.

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

[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");
}
Run Code Online (Sandbox Code Playgroud)

UpdateModel的调用抛出InvalidOperationException而没有InnerException:

The model of type 'TestApplication.Models.Foo' was not successfully updated.
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*ntz 7

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

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

  1. 从数据库中读入实体并将其分配给控制器中的导航属性.
  2. 不要尝试为导航属性实现实体; 而只是分配EntityKey.

后者就是我所做的.您可以在自定义模型绑定器或控制器中执行此操作.您可以阅读更多关于在链接上执行此操作的内容,并且在该链接的注释中有一些示例代码.

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