1

ナビゲーションプロパティをEntityFrameworkで更新する方法を理解するのに問題があります。私はデータベースファーストのアプローチを使用し、すべての適切なFK関係を設定しました。私が使用している2つのテーブルは次のようになります。

レートプロファイル

  • RateProfileID
  • プロファイル名

レート

  • RateID
  • RateProfileID(FK)
  • 更新したい他のいくつかのプロパティ

1つのRateProfileは、多くのレートを持つことができます。RateProfileエンティティとそれに関連するすべてのRateエンティティのエディターを表示するために、RateProfileの編集ページを作成し、送信ボタンのあるフォームにすべてを貼り付けました。すべてを正常に表示できますが、変更はモデルクラス(RateProfile)に対してのみ保持され、ナビゲーションプロパティ(Rates)に対しては保持されません。

以下は私のビュー/HttpPost編集/モデルです。私のHttpPost編集メソッドでは、モデルのナビゲーションプロパティRatesの各レコードをループして更新するという私の微妙な試みを見ることができます。

@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; }
}
4

2 に答える 2

3

foreachintoステートメントを変更して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>
}
于 2012-06-23T03:26:09.463 に答える
0

では、Edit foreachステートメントにブレークポイントを設定し、rateprofile.Ratesの内容を確認するとどうなりますか?

ビューから戻るモデルは、渡した元のオブジェクトではなく、コントローラー関数で最初から作成された切断されたオブジェクトであることに注意してください。

また、Ratesがハッシュセットであるのはなぜですか?データベース参照制約とUI制約を混在させないでください。混乱が増えるだけです:)

マークがここで提案したことは正しいです。フォームのフィールドには、Rates [0] .ProfileName、Rates [1] .ProfileNameなどの名前を付ける必要がありますが、HashSetがあるため、MVCがそれらをモデルに再生成する方法がわかりません。

ブレークポイントでテストしてから、Markの提案に従ってください。HashSetを配列またはリストに置き換えることをお勧めします。

于 2012-06-23T04:17:18.580 に答える