Entity framework MVC2 RTM-使用实体框架对复杂对象进行模型绑定

Entity framework MVC2 RTM-使用实体框架对复杂对象进行模型绑定,entity-framework,asp.net-mvc-2,model-binding,Entity Framework,Asp.net Mvc 2,Model Binding,我是MVC的新手,我觉得这应该是一个非常常见的场景,我真的很挣扎。我正在使用MVC2 RTM,以及我的模型对象的实体框架 我的工作内容: 包含子对象集合的父对象的编辑视图。该表单显示父对象的所有可编辑字段,并遍历并显示所有关联子对象(在同一视图中)的所有可编辑字段。我能够成功地处理控制器中的编辑操作,但在尝试将表单集合中的值绑定到EF模型对象时遇到问题 问题是: 在我的控制器函数中,当我调用TryUpdateModel并传递父对象时,我得到以下错误: “EntityCollection已初始化。

我是MVC的新手,我觉得这应该是一个非常常见的场景,我真的很挣扎。我正在使用MVC2 RTM,以及我的模型对象的实体框架

我的工作内容:

包含子对象集合的父对象的编辑视图。该表单显示父对象的所有可编辑字段,并遍历并显示所有关联子对象(在同一视图中)的所有可编辑字段。我能够成功地处理控制器中的编辑操作,但在尝试将表单集合中的值绑定到EF模型对象时遇到问题

问题是:

在我的控制器函数中,当我调用TryUpdateModel并传递父对象时,我得到以下错误:

“EntityCollection已初始化。在反序列化对象图期间,应仅调用InitializeRelatedCollection方法来初始化新的EntityCollection。”

我看到过很多其他帖子,都是有类似问题的人发的,但都没有找到解决方案。如果不构建自定义模型绑定器,这是不可能的吗?如果有人有一个有效的例子,我将不胜感激。出于某种原因,我能够遍历子集合并成功地在子对象上执行TryUpdateModel,但是当我在父对象上调用它时,就会抛出上面的错误。理想情况下,我希望为父对象调用一次,并从表单更新整个对象树

以下是控制器代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
        {
            EFEntities ef = new EFEntities();
            ParentObject parent = ef.ParentObjects.SingleOrDefault(p => p.ID == id);

            if (ModelState.IsValid)
            {
                int i = 0;
                foreach (child in parent.ChildObjects)
                {
                    //this works fine
                    TryUpdateModel(child, "ChildObjects[" + i + "]"); 
                    i++;
                }

                //this blows up
                if (TryUpdateModel(parent)) 
                {                    
                    ef.SaveChanges();
                    return RedirectToAction("Details", new { id = parent.ID });
                }
            }
            return View(parent);
        }

谢谢你提出这个问题,虽然没有人回答,但它给了我答案。我能找到的最好的方法是(用你的例子):


最终我找到了一个更优雅的解决方案,但我再也没有回来发布它。这里是-抱歉耽搁了:

if (ModelState.IsValid)
        {
            if (TryUpdateModel(parent, new[] "prop1", "prop2", "prop3" })) //specify parent-only properties to include
            {
                if (TryUpdateModel(parent.ChildObjects, "ChildObjects"))
                {
                    _ef.SaveChanges();
                    return RedirectToAction("Details", new { id = parent.ID })                    }
            }
        }
        return View(parent);
我正在将这段代码从现实生活中的应用程序转换过来,因此,我对任何输入错误表示歉意

if (ModelState.IsValid)
        {
            if (TryUpdateModel(parent, new[] "prop1", "prop2", "prop3" })) //specify parent-only properties to include
            {
                if (TryUpdateModel(parent.ChildObjects, "ChildObjects"))
                {
                    _ef.SaveChanges();
                    return RedirectToAction("Details", new { id = parent.ID })                    }
            }
        }
        return View(parent);