ナビゲーションプロパティを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; }
}