0

我有一个 MVC 项目,我有一个需要同时更新父实体和多个子实体的情况。在发布操作中,我收到“尝试删除 x 和 x 之间的关系,但是关系的外键之一”,这很奇怪,我所做的只是更新,我没有删除任何实体。我正在使用 Linq to SQL 和 MVC3。伪代码如下:

@model Project.Models.ParentModel

...

@using (Html.BeginForm()) {
@Html.Label("Parent property")
@Html.EditorFor(model => model.ParentProperty)

@foreach (var child in Model.Childs)
{
Html.RenderPartial("_EditChild", child)
// Which is nothing more than a label and an editor for a property like:
// @model Project.Models.ChildModel
// @Html.Label("Child property")
// @Hteml.EditorFor(model => model.ChildProperty)
}

...

}

动作看起来像:

public ActionResult Edit(int id, FormCollection collection)
{

var parent = new Parent();
TryUpdateModel(Parent()); // which updates the parent and the child properties correctly
dataContext.SubmitChanges();

}

任何人都可以解释这种行为。再一次,我不会删除或删除任何子实体!

4

1 回答 1

0

对列表的绑定可能非常讨厌,我自己也遇到了一些问题。我修改了我的列表编辑代码以与孩子一起使用并对其进行了测试,它可以正常工作并且数据已正确绑定并在发布操作中可见:

@model MvcApplication2.Models.Parent

@using (Html.BeginForm())
{
    <table>
        @{
                <tr>
                    <td>
                        @Html.TextBoxFor(m => m.Text)
                        @Html.HiddenFor(m => m.ID)
                    </td>
                </tr>
                for (int i = 0; i < Model.Children.Count; i++)
                {
                            <tr>
                                <td>
                                    @Html.TextBoxFor(x => x.Children[i].Title)
                                    @Html.HiddenFor(x => x.Children[i].ID)
                                </td>
                            </tr>
                }
        }
    </table>
    <div class="button">
        <input class="submit" type="submit" name="btnSave" id="btnSave" value="Save" />
    </div>
}

我的测试控制器如下所示:

[HttpGet]
public ActionResult EditingChildren()
{
    Parent parent = new Parent() { Text = "" };
    parent.Children = new List<Child>();
    parent.Children.Add(new Child() { Title = "" });
    parent.Children.Add(new Child() { Title = "" });
    parent.Children.Add(new Child() { Title = "" });
    return View(parent);
}

[HttpPost]
public ActionResult EditingChildren(Parent parent)
{
    // save parent with children
}

编辑我关于使用 linq to sql 保存数据的帖子:

如果您没有在视图上绑定 ID,它将在 post 方法中的对象中留空。这会给您保存数据带来麻烦。因此,我通常将 ID 绑定到一个隐藏字段,这样它就不会再为空了(查看上面编辑的代码并在 TextBoxFor 下添加了 HiddenFor)。

还可以在此网站上查看有关使用 linq to sql 更新数据的信息:

http://davedewinter.com/2009/04/07/linq-to-sql-updating-entities/(在附加实体、更改属性、更新下)

和这篇文章: 在此处输入链接描述

于 2012-08-30T09:22:54.123 回答