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

标签 asp.net-mvc entity-framework

如果我的数据库中有 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 的事实,这不足以在不访问数据库的情况下实现实体。

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

  • 从数据库中读取实体并将其分配给 Controller 中的导航属性。
  • 不要尝试为导航属性具体化实体; instead just assign the EntityKey .

  • 后者是我所做的。您可以在自定义模型绑定(bind)器或 Controller 中执行此操作。您可以在链接中阅读更多有关执行此操作的信息,并且我在该链接的评论中有一些示例代码。

    即将推出的 .NET 4.0 中的新版本 Entity Framework 将具有一个名为“FK 关联”的新功能,这将大大简化此操作。

    关于asp.net-mvc - System.Web.MVC.UpdateModel 可以更新 EF 导航属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885270/

    相关文章:

    entity-framework - EF Core 2.1.2 和 .net core 2.0 - Linq2Entities 导致 'must be reducible node' 错误

    javascript - 数据集返回 JavaScript AngularJS

    asp.net-mvc - Ext.NET 未与 ASP.NET MVC 4 集成

    c# - MVC5 Ninject 绑定(bind)和 HttpContext

    asp.net-mvc - MVC C# Entity Framework 的专家教程/书籍

    c# - 为什么EF会从数据库加载数据而忽略本地变化?

    .net - 有人知道 ASP.NET MVC 4 的进展吗

    c# - 从没有其属性的 web api 返回 JsonResult

    asp.net-mvc - EntityType 没有定义键。 [Key] 出示

    c# - 使用 Func 和 OrderByDescending 时 Linq 查询花费的时间太长