【问题标题】:Update a child table in Entity Framework更新实体框架中的子表
【发布时间】:2012-03-07 15:14:42
【问题描述】:

我的数据库中有 2 个表:“竞赛”和“竞赛答案”。每场比赛总是有3个答案。我希望能够为相同的视图编辑 Competition 和 CompetitionAnswers。我已经设法通过使用编辑器模板使视图工作

这是我的编辑器模板:

 @ModelType golfbug.Answer

<div class="editor-label left">
 Answer:<br />
 </div>
<div class="editor-field right">
@Html.HiddenFor(Function(model) model.CompetitionID)
@Html.HiddenFor(Function(model) model.CompetitionAnswersID)
@Html.EditorFor(Function(model) model.CompetitionAnswer)
</div>
<div class="clear"></div>

这是我的观点

@ModelType golfbug.Competition

@Code
ViewData("Title") = "Edit"
End Code

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">       </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"    type="text/javascript"></script>

@Using Html.BeginForm()
@Html.ValidationSummary(True)
@<fieldset>
    <legend>Competition</legend>

    @Html.HiddenFor(Function(model) model.CompetitionID)

    <div class="editor-label left">
        @Html.LabelFor(Function(model) model.ClientID, "Client")
    </div>
    <div class="editor-field right">
        @Html.DropDownList("ClientID", String.Empty)
        @Html.ValidationMessageFor(Function(model) model.ClientID)
    </div>
    <div class="clear"></div>
    <div class="editor-label left">
        @Html.LabelFor(Function(model) model.StartDate)
    </div>
    <div class="editor-field right">
        @Html.EditorFor(Function(model) model.StartDate)
        @Html.ValidationMessageFor(Function(model) model.StartDate)
    </div>
      <div class="clear"></div>
    <div class="editor-label left">
        @Html.LabelFor(Function(model) model.CompetitionName)
    </div>
    <div class="editor-field right">
        @Html.EditorFor(Function(model) model.CompetitionName)
        @Html.ValidationMessageFor(Function(model) model.CompetitionName)
    </div>
      <div class="clear"></div>
    <div class="editor-label left">
        @Html.LabelFor(Function(model) model.CompetitionDetails)
    </div>
    <div class="editor-field right">
        @Html.EditorFor(Function(model) model.CompetitionDetails)
        @Html.ValidationMessageFor(Function(model) model.CompetitionDetails)
    </div>
      <div class="clear"></div>
    <div class="editor-label left">
        @Html.LabelFor(Function(model) model.CompettionQuestion)
    </div>
    <div class="editor-field right">
        @Html.EditorFor(Function(model) model.CompettionQuestion)
        @Html.ValidationMessageFor(Function(model) model.CompettionQuestion)
    </div>
    <div class="clear"></div>

    @Html.EditorFor(Function(model) model.Answers)



    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
 End Using

<div>
@Html.ActionLink("Back to List", "Index")
</div>

当我点击保存按钮时,我需要控制器更新答案表中的答案。目前,我只有 Visual Studio 生成的代码。我想我必须遍历答案并更新它们,但我不知道该怎么做。

这是我的控制器代码:

Function Edit(competition As Competition) As ActionResult
        If ModelState.IsValid Then

            db.Competitions.Attach(competition)
            db.ObjectStateManager.ChangeObjectState(competition, EntityState.Modified)

            db.SaveChanges()

            Return RedirectToAction("Index")
        End If

        ViewBag.ClientID = New SelectList(db.Clients, "ClientID", "ClientName", competition.ClientID)
        Return View(competition)
    End Function

任何帮助将不胜感激。我已经在 Google 上搜索了 2 天了。

【问题讨论】:

    标签: asp.net asp.net-mvc vb.net entity-framework


    【解决方案1】:

    当您检查competition.Answers 时,您是否看到该属性中的值?如果是这样,您将不得不像这样手动添加它们:

    db.Answers.Add(competition.Answers[0]);
    

    另外,请查看此链接,了解 AttachAdd 之间的差异信息

    Entity Framework 4 - AddObject vs Attach

    既然你说comptetitions 总是有 3 个答案,这里有一个替代解决方案: 当您创建“竞赛”时,您可以创建 3 个CompetitionAnswers(带有将它们标记为未答复的标志)。然后,您的编辑代码应该可以正常工作了。

    【讨论】:

    • 我以为 db.Answers.Add(competition.Answers[0]);如果您正在创建新记录,则使用。这些记录已经存在于数据库中。在我的编辑功能中,我可以遍历答案并查看它们的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多