Iai*_*ain 4 asp.net-mvc entity-framework
如果我的数据库中有2个表:Foo和bar.Foo由FooId标识,Bar是BarId的标识符.一个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)
我的控制器从我视图中的下拉列表更新基于实体框架的模型的正确方法是什么?
不,默认模型绑定器无法执行此操作.你也很难写一个自定义模型绑定器来做到这一点.HTML SELECT元素仅在描述中存储ID值,不足以实现大多数实体实例.所以我们只需要处理这样一个事实,即我们将只获取一个ID,这不足以实现一个实体而不会访问数据库.
因此,在更新实体的导航属性时,我们有两个选择:
后者就是我所做的.您可以在自定义模型绑定器或控制器中执行此操作.您可以阅读更多关于在链接上执行此操作的内容,并且在该链接的注释中有一些示例代码.
即将推出的.NET 4.0中新版本的Entity Framework将有一个名为"FK Associations"的新功能,这将使这一过程变得相当容易.