データベースにReviewというテーブルがあり、EntityFrameworkを使用して読み取り/書き込みアクションとビューを含むReviewControllerを作成しました。つまり、それはすべてスキャフォールドコードです。
これは私の編集ページです。
@model UniversityApp.Models.Review
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Review</legend>
@Html.HiddenFor(model => model.ReviewID)
<div class="editor-label">
@Html.LabelFor(model => model.MovieID, "Movie")
</div>
<div class="editor-field">
@Html.DropDownList("MovieID", String.Empty)
@Html.ValidationMessageFor(model => model.MovieID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserID, "User")
</div>
<div class="editor-field">
@Html.DropDownList("UserID", String.Empty)
@Html.ValidationMessageFor(model => model.UserID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
ご覧のとおり、スキャフォールディングメカニズムにより、外部値キー用のエディターが追加されました。ユーザーがレビューを行った後でユーザーIDまたは映画IDを手動で変更できないようにするため、このコードを削除しました。しかし、レビューエントリを編集すると、データベースSaveChanges()で次のエラーが発生します。
対応する主キー値が存在しないため、外部キー値を挿入できません。[外部キー制約名=Review_User]
古いユーザーIDとムービーIDの値を保持するには、編集アクションで何をすべきですか?
ReviewControllerの編集アクションのコードは次のとおりです。
public ActionResult Edit(int id)
{
Review review = db.Reviews.Find(id);
ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID);
ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID);
return View(review);
}
[HttpPost]
public ActionResult Edit(Review review)
{
if (ModelState.IsValid)
{
db.Entry(review).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID);
ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID);
return View(review);
}
編集 :
説明した方法を試しましたが、まだ問題があります。表示されるエラーメッセージは次 のとおりです。参照整合性制約違反が発生しました:参照制約を定義するプロパティ値が、関係のプリンシパルオブジェクトと依存オブジェクトの間で一貫していません。何が間違っているのかわかりません。エラーは、次のコード行でトリガーされます。
db.Entry(review).State = EntityState.Modified;