Entity framework MVC2 RTM-使用实体框架对复杂对象进行模型绑定
我是MVC的新手,我觉得这应该是一个非常常见的场景,我真的很挣扎。我正在使用MVC2 RTM,以及我的模型对象的实体框架 我的工作内容: 包含子对象集合的父对象的编辑视图。该表单显示父对象的所有可编辑字段,并遍历并显示所有关联子对象(在同一视图中)的所有可编辑字段。我能够成功地处理控制器中的编辑操作,但在尝试将表单集合中的值绑定到EF模型对象时遇到问题 问题是: 在我的控制器函数中,当我调用TryUpdateModel并传递父对象时,我得到以下错误: “EntityCollection已初始化。在反序列化对象图期间,应仅调用InitializeRelatedCollection方法来初始化新的EntityCollection。” 我看到过很多其他帖子,都是有类似问题的人发的,但都没有找到解决方案。如果不构建自定义模型绑定器,这是不可能的吗?如果有人有一个有效的例子,我将不胜感激。出于某种原因,我能够遍历子集合并成功地在子对象上执行TryUpdateModel,但是当我在父对象上调用它时,就会抛出上面的错误。理想情况下,我希望为父对象调用一次,并从表单更新整个对象树 以下是控制器代码: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已初始化。
[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);