使用实体框架更新导航属性(MVC3 Razor)

时间:2012-06-23 02:34:56

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

我无法弄清楚如何使用Entity Framework更新导航属性。我使用数据库第一种方法并设置所有适当的FK关系。这是我正在使用的两个表格的样子:

评价资料

  • RateProfileID
  • 摘要名称

  • RateID
  • RateProfileID(FK)
  • 我想要更新的其他几个属性

一个RateProfile可以/将有很多费率。我为RateProfile构建了我的编辑页面,以显示RateProfile实体及其所有关联的Rate实体的编辑器,并将所有这些都粘贴在带有提交按钮的表单中。我可以很好地显示所有内容,但我的更改只会持续存在于模型类(RateProfile)而不是其导航属性(Rates)。

以下是我的观点/ HttpPost编辑/模型 在我的HttpPost Edit方法中,您可以看到我的微弱尝试循环并更新模型的导航属性Rate中的每条记录。

@model  PDR.Models.RateProfile

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>RateProfile</legend>

    @Html.HiddenFor(model => model.RateProfileID)
    @Html.HiddenFor(model => model.LoginID)

    <div class="editor-label">
        @Html.LabelFor(model => model.ProfileName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ProfileName)
        @Html.ValidationMessageFor(model => model.ProfileName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.isDefault)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.isDefault)
        @Html.ValidationMessageFor(model => model.isDefault)
    </div>
    <div>
        <fieldset>
        <legend>Dime</legend>
        <table>
            <tr>
                <th>
                    Min
                </th>
                <th>
                    Max
                </th>
                <th>
                    Price
                </th>
                <th></th>
            </tr>
        @foreach (var rate in Model.Rates)
        {
            <tr>
                <td>
                    @Html.EditorFor(modelItem => rate.minCount)

                    @Html.ValidationMessageFor(model => rate.minCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rate.maxCount)
                    @Html.ValidationMessageFor(model => rate.maxCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rate.Amount)
                    @Html.ValidationMessageFor(model => rate.Amount)
                </td>
            </tr>
        }
        </table>
    </fieldset>

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

[HttpPost]
    public ActionResult Edit(RateProfile rateprofile)
    {

        if (ModelState.IsValid)

        {
            db.Entry(rateprofile).State = EntityState.Modified;

            foreach (Rate rate in rateprofile.Rates)
            {
                db.Entry(rate).State = EntityState.Modified;
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(rateprofile);
    }

public partial class Rate
{
    public int RateID { get; set; }
    public int RateProfileID { get; set; }
    public string Size { get; set; }
    public decimal Amount { get; set; }
    public int minCount { get; set; }
    public int maxCount { get; set; }
    public int PanelID { get; set; }

    public virtual Panel Panel { get; set; }
    public virtual RateProfile RateProfile { get; set; }
}

public partial class RateProfile
{
    public RateProfile()
    {
        this.Rates = new HashSet<Rate>();
    }

    public int RateProfileID { get; set; }
    public string ProfileName { get; set; }
    public int LoginID { get; set; }
    public bool isDefault { get; set; }

    public virtual Login Login { get; set; }
    public virtual ICollection<Rate> Rates { get; set; }
}

2 个答案:

答案 0 :(得分:3)

您将foreach更改为for语句,并尝试模型绑定是否正常工作。

@for (var int i = 0; i < Model.Rates; i++)
{
    <tr>
        <td>
            @Html.EditorFor(modelItem => Model.Rates[i].minCount)
            @Html.ValidationMessageFor(model => Model.Rates[i].minCount)
        </td>
        <td>
            @Html.EditorFor(modelItem => Model.Rates[i].maxCount)
            @Html.ValidationMessageFor(model => Model.Rates[i].maxCount)
        </td>
        <td>
            @Html.EditorFor(modelItem => Model.Rates[i].Amount)
            @Html.ValidationMessageFor(model => Model.Rates[i].Amount)
        </td>
    </tr>
}

答案 1 :(得分:0)

那么当您在Edit foreach语句中设置断点并检查rateprofile.Rates中的内容时会发生什么?

请记住,从视图返回的模型不是您分发的原始对象,它是在控制器函数中从头开始创建的断开连接的模型。

另外,为什么Rate a Hashset?不要将数据库引用约束与UI混合使用,因为它只会增加混淆:)

Mark建议的内容是正确的。表单上的字段应该被命名为Rates [0] .ProfileName,Rates [1] .ProfileName等,但是因为你有一个HashSet,我不确定MVC如何将它们重新生成到模型中。

使用断点测试,然后按照Mark的建议,我建议你用数组或列表替换HashSet。