2

私は次のモデルを持っています

public class CourseModel
{
    [Key]
    public int courseID { get; set; }
    ...
    public virtual ICollection<CourseMeetModel> meets { get; set; }
}

エントリの1つを編集しようとして、入力が有効な場合は正常に機能します。ただし、有効でない場合は、ユーザーに間違いを警告します。ユーザーが間違いを修正して保存しようとすると、次の例外が発生します。

ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

入力がコントローラーの検証手順に失敗した場合にこれが発生することに気づきました。

私のコントローラー

public ActionResult EditCourseConfirmed(CourseModel course)
{
        CoursesDBContext db = new CoursesDBContext();
        bool valid = validateCouse(course); //If this fails and the course model is returned back to the view I get that error
        if (valid)
        {
                try
                {
                    db.Entry(course).State = EntityState.Modified;
                    db.SaveChanges();
                    Session[d.s_Clear] = false;
                    return RedirectToAction("Index");
                }
                catch (Exception e)
                {
                    ModelState.AddModelError(string.Empty, "Unable to save the course, please try again." + e.Message);
                    return View(course);
                }

        }

        return View(course);
}
4

4 に答える 4

2

ユーザー@ user1166147のおかげで、dbupdate例外が発生していましたが、理由はまだわかりません...

EF4 CTP5 DbContext には更新方法がないため、これを行うことになりました。

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException e)
    {
        var entry = e.Entries.Single();
        entry.OriginalValues.SetValues(entry.CurrentValues);
        entry.CurrentValues.SetValues(entry.CurrentValues);
        db.SaveChanges();
    }

詳細はこちらhttp://blogs.msdn.com/b/adonet/archive/2011/02/03/using-dbcontext-in-ef-feature-ctp5-part-9-optimistic-concurrency-patterns.aspx

于 2012-05-27T23:08:45.333 に答える
2

これを試して

try {
   context.SaveChanges();
} 
catch (OptimisticConcurrencyException) 
{
    context.Refresh(RefreshMode.ClientWins, db.table);
    context.SaveChanges();
}

小道具: https://stackoverflow.com/a/6848729/1166147

あなたのコメントに従って、説明するために追加します。EF4 CTP5 のヒントをありがとう。これで問題が解決したことをうれしく思います。承認済みとしてマークしてください。このエラーが発生した場合は、ロードと更新の間にデータ (別のユーザーなど) を変更する何かが発生したか、問題を引き起こすトリガーが存在するか、またはストアド プロシージャを使用している場合は 0 recs をヒットします。詳しい情報がないとわかりにくいです。これが最初の更新ヒットですか?ユーザーがエラーに遭遇する前に成功した別の更新プログラムが最初に実行され、変更され、更新せずに続行しようとしましたか? きっかけはありますか?同時実行の程度はどの程度ですか? このユーザーのクエリと更新の間に別のユーザーが編集および保存しましたか? 私が提供した投稿へのリンクを読んでください - エンティティキーのメタデータが置き換えられると、誰かが ReadOnlyAttribute に言及しました。

(MSDN から変更) 既定では、Entity Framework は楽観的同時実行モデルを実装します。これは、データがクエリされてからデータが更新されるまでの間、データ ソース内のデータに対してロックが保持されないことを意味し、別のユーザーがデータを変更した場合にこのエラーが発生する可能性があります。この属性を使用すると、Entity Framework は変更を保存する前にデータベース内の変更をチェックします。

競合する変更があると、 OptimisticConcurrencyExceptionが発生します。

OptimisticConcurrencyException は、ストアド プロシージャを使用してデータ ソースを更新するエンティティ データ モデルを定義するときにも発生する可能性があります。この場合、更新を実行するために使用されるストアード・プロシージャーがゼロ行が更新されたことを報告すると、例外が発生します。SET NOCOUNT ON はこれを修正します。

于 2012-05-27T21:57:44.507 に答える
1

あなたの見解では、これを必ず追加してください

@Html.HiddenFor(m => m.courseID)
于 2012-05-27T22:12:22.500 に答える