0

この奇妙な「エラー」が発生します。アプリを実行すると (編集アクション、つまり更新)、dB に重複した値が保存されます。デバッガーを使用すると、ステップバイステップで動作します(重複なし)...

これは多対多の関係なので、画像の Courses NULL 値を気にしないでください。ただ物事を理解しようとしています...

すべてのヘルプに感謝します!

  [HttpPost]
    public ActionResult Edit(CourseStudentViewModel model)
    {
        var course = db.Courses
            .Where(c => c.Id == model.CourseId)
            .Single();

        if (ModelState.IsValid)
        {
            course.Name = model.CourseName;
            course.Description = model.CourseDescription;
            course.Students = model.Students;

            if(course.Id != 0) {
                db.Entry(course).State = System.Data.EntityState.Modified;
            }
            else {
                db.Courses.Add(course);
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        //modelstate not valid, display form
        return View(model);
    }

ビューモデルを取り戻します。すべて良い。 私が取り戻す私のビューモデル

dBからの私の古い値。このデータを更新したい。だから、すべてはまだ良いです...

ここに画像の説明を入力

古い価値観が新しい価値観に更新されます。すごい!

ここに画像の説明を入力


このようにデバッガーを使用すると、すべてがうまく機能します。しかし、アプリを実行すると、重複が発生します....誰か?

新しいコンテンツ:

私の編集ビュー

@model ValueInjecter.Web.Models.CourseStudentViewModel

@{ ViewBag.Title = "編集"; }

コースを編集

@using (Html.BeginForm()) { @Html.HiddenFor(c => Model.CourseId) @Html.LabelFor(c => Model.CourseName) @Html.EditorFor(c => Model.CourseName)

    @Html.LabelFor(c => Model.CourseDescription)
    @Html.EditorFor(c => Model.CourseDescription)
</div>

<hr />
<h2>Students</h2>

<div class="editor-field">
    @for (int i = 0; i < Model.Students.Count(); i++)
    {
        <div style="border: dotted 1px; padding: 5px; margin: 10px;">
            @Html.HiddenFor(s => s.Students[i].Id)

            @Html.LabelFor(s => s.Students[i].Name[i + 1])
            @Html.EditorFor(s => s.Students[i].Name)
        </div>
    }
</div>
<p>
    Number of Students: 
<b>@Html.DisplayFor(s => Model.StudentCount)</b>
</p>
<hr />
<p>
    <input type="submit" value="Save" />
</p> }
4

2 に答える 2

0

プロパティウォッチウィンドウでコレクションを調べると、コレクションの遅延ロードによりcourse.Students、実際には2番目のデータベースクエリ(をロードするクエリの後)をトリガーするため、おそらくデバッガで機能します。(コレクションは として宣言されている可能性が最も高いです。) デバッガーなしで実行すると、遅延読み込みは発生せず、空のままになります。courseStudentsCourse.Studentsvirtualcourse.Students

遅延読み込みの代わりに熱心な読み込みcourse.Studentsを使用して、コレクションが常に読み込まれるようにすることができます(これにより、2 回目のデータベース ラウンドトリップも節約されます)。

var course = db.Courses
    .Include(c => c.Students)
    .Where(c => c.Id == model.CourseId)
    .Single();

正直なところ、(デバッガーで) ロードされたコレクションでコードが正しく機能する理由と、それが機能する理由がまったくわかりません。次のように完全に切り離されたコレクションを割り当ててcourse.Students = model.Studentsから、親の状態を に設定するだけでModifiedは、通常、子コレクションを更新するのに十分ではありません。

しかし、私は"ValueInjecter"あなたのスクリーンショットを見ています。おそらく、(偶然にも?) 適切なアップデートを実行する自動マッピング マジックが発生している可能性があります。

于 2013-02-13T21:10:39.247 に答える
0

わかりました、私はついに私の問題の解決策を見つけました。もちろん、最初に考えたよりもはるかに簡単です。

[HttpPost]

    public ActionResult Edit(CourseStudentViewModel model)
    {

        if (ModelState.IsValid)
        {
            var course = db.Courses.Find(model.CourseId);
            course.Name = model.CourseName;
            course.Description = model.CourseDescription;

            if(model.Students != null)
            {
                foreach (var item in model.Students)
                {
                    db.Entry(item).State = System.Data.EntityState.Modified;
                }
            }

            if(course.Id != 0) {
                db.Entry(course).State = System.Data.EntityState.Modified;
            }
            else {
                db.Courses.Add(course);
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        //modelstate not valid, display form
        return View(model);
    }

上に貼り付けたビューをまだ使用しています。

于 2013-02-14T16:12:54.953 に答える