2016-12-29 20 views
2

我有一個加載在一個受保護的字典成員的EF6實體基本控制器。但不知何故,它停止其他控制器從更新該實體。下面是簡化的代碼 -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); 
    } 
} 

的錯誤是「連接類型的實體失敗,因爲同類型的另一實體已經有相同的主鍵值」,它是在db.Entry(mt).State = EntityState.Modified;

當你拋出可以看到,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