加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:51:47 所属栏目:asp.Net 来源:网络整理
导读:如果我的数据库中有2个表:Foo和bar. Foo由FooId标识,Bar是BarId的标识符.一个Bar可以有0到多个Foos,因此Foo有BarId作为外键. 我有一个代表这个的模型和一个可用于编辑Foo并从关联栏中选择(从下拉列表中)的视图. 在控制器上给出以下方法: [AcceptVerbs(Http
如果我的数据库中有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");
}

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

The model of type 'TestApplication.Models.Foo' was not successfully updated.

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

解决方法

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

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

>从数据库中读取实体并将其分配给控制器中的导航属性.
>不要试图为导航属性实现实体; instead just assign the EntityKey.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读