jsl*_*tts 8 c# asp.net entity-framework asp.net-mvc-2
我的数据库中有一个表与另一个表的一对多关系,它与第三个表有关系:
ParentObject
ChildObject
AnotherObject
对象映射到实体框架并通过数据访问类公开.
当要显示的数据与域对象有很大不同时,建议使用ViewModel,因此我创建了一个ViewModel,如下所示:
public class ViewModel {
public IList<ParentObject> ParentObjects { get; set; }
public ParentObject selectedObject { get; set; }
public IList<ChildObject> ChildObjects { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个显示ParentObjects列表的视图,当单击时将允许保存ChildObject.
<% using (Html.BeginForm()) { %>
<table>
<% foreach (var parent in Model.ParentObjects) { %>
<tr>
<td>
ObjectID [<%= Html.Encode(parent.ID)%>]
</td>
<td>
<%= Html.Encode(parent.Name)%>
</td>
<td>
<%= Html.Encode(parent.Description)%>
</td>
</tr>
<% } %>
</table>
<% if (Model.ParentObject != null) { %>
<div>
Name:<br />
<%= Html.TextBoxFor(model => model.ParentObject.Name) %>
<%= Html.ValidationMessageFor(model => model.ParentObject.Name, "*")%>
</div>
<div>
Description:<br />
<%= Html.TextBoxFor(model => model.ParentObject.Description) %>
<%= Html.ValidationMessageFor(model => model.ParentObject.Description, "*")%>
</div>
<div>
Child Objects
</div>
<% for (int i = 0; i < Model.ParentObject.ChildObjects.Count(); i++) { %>
<div>
<%= Html.DisplayTextFor(sd => sd.ChildObjects[i].Name) %>
</div>
<div>
<%= Html.HiddenFor(sd => sd.ChildObjects[i].ID )%>
<%= Html.TextBoxFor( sd => sd.ChildObjects[i].Description) %>
<%= Html.ValidationMessageFor(sd => sd.ChildObjects[i].Description, "*") %>
</div>
<% }
}
} %>
Run Code Online (Sandbox Code Playgroud)
一切正常.我的问题是更新EF对象并将更改保留回数据库的最佳方法.我最初尝试过:
[HttpPost]
public ActionResult Edit(ViewModel viewModel) {
ParentObject parent = myRepository.GetParentObjectByID(viewModel.SelectedObject.ID);
if ((!ModelState.IsValid)
|| !TryUpdateModel(parent, "SelectedObject", new[] { "Name", "Description" })) {
|| !TryUpdateModel(parent.ChildObjects, "ChildObjects", new[] { "Name", "Description" })) {
//Code to handle failure and return the current model snipped
return View(viewModel);
}
myRepository.Save();
return RedirectToAction("Edit");
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将更改保存到子对象时,我得到此异常:"MyEntities.ChildObject"中的实体参与"FK_ChildObject_AnotherObject"关系.找到了0个相关的'AnotherObject'.1'AnotherObject'是预料之中的.
对StackOverflow和一般谷歌搜索的调查使我看到这篇博文似乎描述了我的问题:TryUpdateModel()无法正确处理嵌套集合.显然,(并通过调试器逐步确认这一点)它创建了一个新的ChildObject,而不是与我实例化的上下文中的EF对象相关联.
我的hacky工作是这样的:
if (viewModel.ChildObjects.Count > 0) {
foreach (ChildObject modelChildObject in viewModel.ChildObjects) {
ChildObject childToUpdate = ParentObject.ChildObject.Where(a => a.ID == modelChildObject.ID).First();
childToUpdate.Name = modelChildObject.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.我向你问好的人:有没有正确的方法呢?我尝试按照上面发布的博客链接制作自定义模型绑定器的建议,但它不起作用(反射有问题,代码期望某些属性存在),我需要尽快得到一些东西.
PS - 我试图清理代码以隐藏特定信息,所以要注意我可能已经有些东西了.我主要想知道其他人是否已经解决了这个问题.
小智 1
只需简单地查看提及 FK_ChildObject_AnotherObject 的错误...您确定 EF 数据模型中有关 AnotherObject 的所有内容都已正确连接吗?
在您的问题中,您只列出了两个表,但此错误表明 ChildObject 正在参与与 AnotherObject 的 1 to * 关系,并且保存时实体中不存在导致错误的关系。
尝试从该情况中删除 AnotherObject,以便测试 ParentObject 和 ChildObject 之间的任何假定问题,或者尝试将 FK_ChildObject_AnotherObject 关系更改为 0..1 到 * 短暂进行测试。
| 归档时间: |
|
| 查看次数: |
3006 次 |
| 最近记录: |