0

ASP.NET MVCアプリケーションで、次の2つの関連モデルを更新しようとしています。

if (ModelState.IsValid) {

    _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason);
    _accommpropertyseasonrepo.Save();

    _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail);
    _accommpropertyseasondetailrepo.Save();

    return RedirectToAction("Details", new { id = id });
}

最初のものは問題なく通過していますが、2番目のものを更新しようとすると、並行性が発生し、以下のエラーがスローされます。

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

私がここでやろうとしていることを達成する方法は何ですか?

アップデート

_accommpropertyseasondetailrepo Edit方法は次のとおりです。

public void Edit(AccommPropertySeasonDetail entity) {

    _context.Entry(entity).State = System.Data.EntityState.Modified;
}

_accommpropertyseasonrepo Edit方法は次のとおりです。

public void Edit(AccommPropertySeason entity) {
            _context.Entry(entity).State = System.Data.EntityState.Modified;
        }

更新2

アクションメソッド全体は次のとおりです。

public ActionResult SeasonEdit_post(int id, int subid, 
    [Bind(Exclude = 
        "AccommPropertySeason.CreatedBy,AccommPropertySeason.CreatedOn")]
    AccommPropertySeasonCreateViewModel accommPropertySeasonCreateViewModel) {

    if (ModelState.IsValid) {

        _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason);
        _accommpropertyseasonrepo.Save();


                    _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail);
        _accommpropertyseasondetailrepo.Save();

        return RedirectToAction("Details", new { id = id });
    }

    return View(accommPropertySeasonCreateViewModel);
}

アップデート

Brutal Truth:ビューの次のコード行を忘れたため、モデルはPKなしで戻ってきました:

@Html.HiddenFor(m => m.AccommPropertySeasonDetail.AccommPropertySeasonDetailID)

問題は解決しました!

4

2 に答える 2

2

あなたがこれをしている完全に正当な理由があるかもしれませんが、その理由を知らなければ、これはあなたがしていることを達成するための非常に悪い方法のように見えます。

データベースにクエリを実行してエンティティが存在することを確認し、存在する場合はエンティティを更新してそれらの変更を保存する必要があります。

var entity = repository.GetAccomPropertySeason(id);

if( entity == null )
   return View("NotFound");

// update the model here
repository.SaveChanges();

これを書いた方法で、オブジェクトが実際に存在しない場合は、このエラーが発生します。

Detailsオブジェクトの親IDが正しいことを確認しますか?きちんと縛られていますか?その外観から、それが存在することをコンテキストに伝え、それを更新しようとしていますが、コンテキストはSaveChangesを呼び出したときにエンティティを実際に見つけることができません。

(既存のオブジェクトを変更するのではなく)新しいオブジェクトを作成することが目的の場合は、代わりに状態を[追加]に設定する必要があります。

于 2011-11-16T21:14:42.747 に答える
1

OPに関する私のコメントからコピー/貼り付け

これは、並行性とは何の関係もないように見えます。何らかの理由で、SQL Updateステートメントの記述方法では、Entity Frameworkはアイテムが更新されることを期待しており、それらのアイテムは存在しません。LINQPadで同じコードを実行し、SQLの結果を見て何が起こっているかを確認できる可能性はありますか?

于 2011-11-16T23:31:22.790 に答える