Asp.net mvc System.Web.MVC.UpdateModel能否更新EF导航属性?
如果我的数据库中有两个表:Foo和barFoo由FooId标识,Bar由BarId标识。一个条可以有0到多个Foo,因此Foo将BarId作为外键 我有一个表示这一点的模型和一个视图,可以用来编辑一个Foo并选择(从下拉菜单中)相关的栏 给定控制器上的以下方法: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 =
[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.