一言で言えば、ラッパーモデルのPOST中に、1つのエントリの状態を「変更済み」に変更するときに例外がスローされます。状態を変更する前に、状態は「Detached」に設定されていますが、Attach()を呼び出しても同じエラーがスローされます。EF6を使用しています。
以下のコードを見つけてください(読みやすくするためにモデル名が変更されています)
型番
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
コントローラ
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
if (!canUserAccessA(id.Value))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
var aViewModel = new AViewModel();
aViewModel.A = db.As.Find(id);
if (aViewModel.Receipt == null)
{
return HttpNotFound();
}
aViewModel.b = db.Bs.Where(x => x.aID == id.Value).ToList();
aViewModel.Vendor = db.Cs.Where(x => x.cID == aViewModel.a.cID).FirstOrDefault();
return View(aViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(AViewModel aViewModel)
{
if (!canUserAccessA(aViewModel.a.aID) || aViewModel.a.UserID != WebSecurity.GetUserId(User.Identity.Name))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
if (ModelState.IsValid)
{
db.Entry(aViewModel.a).State = EntityState.Modified; //THIS IS WHERE THE ERROR IS BEING THROWN
db.SaveChanges();
return RedirectToAction("Index");
}
return View(aViewModel);
}
上記のように
db.Entry(aViewModel.a).State = EntityState.Modified;
例外をスローします:
同じタイプの別のエンティティがすでに同じ主キー値を持っているため、タイプ「A」のエンティティのアタッチに失敗しました。これは、「アタッチ」メソッドを使用するか、グラフ内のエンティティにキー値の競合がある場合にエンティティの状態を「未変更」または「変更」に設定すると発生する可能性があります。これは、一部のエンティティが新しく、データベースで生成されたキー値をまだ受け取っていないことが原因である可能性があります。この場合、「Add」メソッドまたは「Added」エンティティの状態を使用してグラフを追跡し、新しいエンティティ以外の状態を「Unchanged」または「Modified」に適宜設定します。
誰かが私のコードで何か悪いことを見たり、モデルの編集中にそのようなエラーをスローする状況を理解したりしますか?
db
2つのアクション間でインスタンスが同じである場合、アイテムはGETメソッドによって読み込まれ(その後、コンテキストによって追跡されます)、POSTメソッドのインスタンスが前にフェッチされたエンティティとして認識されない可能性があるため、問題が説明されます。 。
canUserAccessA()
エンティティを直接または別のエンティティの関係としてロードしますか?
EntityState
か?あなたの実体がポスト要求から来ると、それは現在のコンテキストによって追跡すべきではない、私はそれはあなたが既存のIDを持つ項目を追加しようと考えていることを推測する