1

データベースに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;
4

2 に答える 2

2

テンプレートにビュー内の列を自動生成させたくない ViewModels でこれを使用してプロパティに注釈を付けます

[ScaffoldColumn(false)]
public int ReviewID;
于 2012-05-23T18:56:55.897 に答える
2

cd smith の非常に良い提案に加えて、このようにビューモデルを装飾したくない場合は、隠しフィールドを追加することもできます。これは次のようになります。

@Html.HiddenFor(x => x.Review_UserID)

など、フォームに表示したいが表示したくない各 FK について。もちろん、これは[ScaffoldColumn(false)]デコレータがどのように機能するかに似ていますが、[HiddenInput(DisplayValue = false)]属性を追加すると、これが明示的に行われます。

于 2012-05-23T19:21:05.223 に答える