2016-12-29 5 views
2

保護されたディクショナリメンバにEF6エンティティをロードするベースコントローラがあります。しかし、何とか他のコントローラがそのエンティティを更新するのを止めます。以下は、単純化されたコードされた - それはあなたのようdb.Entry(mt).State = EntityState.Modified;MVC5 - ベースコントローラに読み込まれたエンティティがエンティティの更新と他の場所で競合しています

でスローされ

public abstract class BaseController : Controller { 
    protected IDictionary<string, int> MyList; 
    public BaseController() { 
     MyList = new Dictionary<string, int>(); 
     foreach (var rc in db.MyTable.Where(r => r.IsActive).ToList()) 
       MyList.Add(rc.Name, rc.Id); 
     ViewBag.MyListViewBag = MyList; 
    } 
} 


public class MyController : BaseController { 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "Id,Name,...other properties")] MyTable mt) { 
     if (ModelState.IsValid) 
     { 
      db.Entry(mt).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(mt); 
    } 
} 

エラーがされ、「同じタイプの別のエンティティが既に同じ主キー値を持っているので、タイプのエンティティをアタッチに失敗しました」 BaseControllerはまずリスト内のエンティティをロードします。これは、少なくとも(私はそれが思った)あらゆる接続を厳重にする必要があります。その周りに道がありますか?

答えて

2

あなたの行動引数から取るあなたのmt変数は、EF追跡オブジェクトの一部ではありません。したがって、それをdbから取り出して、必要なプロパティを更新する必要があります:

public ActionResult Edit([Bind(Include = "Id,Name,...other properties")] MyTable mt) 
{ 
    if (ModelState.IsValid) 
    { 
     var temp = db.MyTable.Single(mt.Id); 
     temp.Name = mt.Name; 
     //copying of other properties... 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(mt); 
} 
+0

ありがとう、これは固定です。エンティティがベースコントローラでアクセスされるまで、既存のコードが正常に動作していたのはまだ変わっていません。 – Achilles

関連する問題