Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc System.Web.MVC.UpdateModel能否更新EF导航属性?_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc System.Web.MVC.UpdateModel能否更新EF导航属性?

Asp.net mvc System.Web.MVC.UpdateModel能否更新EF导航属性?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,如果我的数据库中有两个表:Foo和barFoo由FooId标识,Bar由BarId标识。一个条可以有0到多个Foo,因此Foo将BarId作为外键 我有一个表示这一点的模型和一个视图,可以用来编辑一个Foo并选择(从下拉菜单中)相关的栏 给定控制器上的以下方法: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, FormCollection formCollection) { Foo originalFoo =

如果我的数据库中有两个表:Foo和barFoo由FooId标识,Bar由BarId标识。一个条可以有0到多个Foo,因此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");
}
对UpdateModel的调用引发InvalidOperationException,但不引发InnerException:


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

不,默认的模型绑定器将无法做到这一点。您将很难编写一个自定义的模型活页夹来完成这项工作。HTML SELECT元素只在描述中存储一个ID值,不足以具体化大多数实体实例。因此,我们只需要处理这样一个事实,即我们将只获得一个ID,这不足以在不命中数据库的情况下实现一个实体

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

  • 从数据库中读入实体,并将其分配给控制器中的导航属性
  • 不要尝试具体化导航属性;的实体 后者是我所做的。您可以在自定义模型绑定器或控制器中执行此操作。你可以在这个链接上读到更多关于做这件事的信息,我在这个链接的注释中有一些示例代码


    即将发布的.NET 4.0中实体框架的新版本将有一个名为“FK关联”的新功能,这将大大简化此操作。

    带有EFv4的.NET(4.0)的新版本确实将外键引入实体,但是如果我们使用EditorFor()在我们的视图和类型的自定义模板(强类型为导航属性的类型)中,默认模型绑定器成功地将导航属性的属性绑定到EditorFor模板中的发布值。但是,这仍然不足以让上下文上的SaveChanges()工作。它的错误是1)主键已经存在,或者2)无法更改相关实体的主键(我们实际上没有更改它),但仍然..并且默认绑定器跳过了外键属性,因此,我们可以选择手动设置此属性并将导航属性保留为空。然后它工作并保存更改。难道不能将模型绑定器与附着对象结合使用吗?例如,如果dropdownlist的名称为
    'Bar.Id'
    ,并且您让模型绑定器从表单中创建一个Foo元素(称之为
    myNewFoo
    ),它将填充
    myNewFoo.Bar.Id
    。然后你不能调用
    db.BarTable.Attach(myNewFoo.Bar)
    The model of type 'TestApplication.Models.Foo' was not successfully updated.