2015-12-11 1 views
1

При запуске проекта я получаю эту ошибку« Операция не может быть завершена, потому что DbContext был удален ». Хотя проверка сети я видел много ответов для этого, но я думаю, что у меня есть, что все в моей code.Please проверить мой код и дайте мне знать, что в этом плохого, пожалуйста, помогите мне ... Это код, написанный в контроллере и в Elmah я получаю ошибку.операция не может быть завершена, потому что DbContext был удален. »

public ActionResult Create(Permissions permissions) 
    { 
     try 
     { 
      using (var db = new AdminDb()) 
      { 
       //delete existing permissions of the selected role.. 
       IList<int> ModuleMenu = (from d in db.MenuConfig.AsNoTracking() 
             where d.ModuleId == permissions.ModuleId 
             select d.MenuConfigId).ToList(); 

       var RoleMenu = (from c in db.RoleMenuMapping where ModuleMenu.Contains((int)c.MenuId) && c.RoleId == permissions.RoleId select c).ToList(); 

       foreach (var rm in RoleMenu) 
       { 
        db.RoleMenuMapping.Remove(rm); 
        db.SaveChanges(); // Added for avoiding The object is in a detached state Error 
       } 

       // add new permissions to db 
       if (permissions.RoleMenu != null) 
       { 
        foreach (var rm in permissions.RoleMenu) 
        { 
         RoleMenuMapping RoleMapping = new RoleMenuMapping(); 
         //to get the next ID 
         string EntityName = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<RoleMenuMapping>().EntitySet.Name; 
         Int32 nextval = new Assyst.PanERP.Common.Common().getNextSequence(EntityName); 
         RoleMapping.RoleMenuMappingId = nextval; 
         RoleMapping.RoleId = permissions.RoleId; 
         RoleMapping.MenuId = rm.Id; 
         RoleMapping.BusinessUnitId = 1; 
         RoleMapping.MenuAdd = (rm.Add == true ? 1 : 0); 
         RoleMapping.MenuDelete = (rm.Delete == true ? 1 : 0); 
         RoleMapping.MenuModify = (rm.Modify == true ? 1 : 0); 
         RoleMapping.MenuView = (rm.View == true ? 1 : 0); 
         RoleMapping.MenuImport = (rm.Import == true ? 1 : 0); 
         RoleMapping.MenuExport = (rm.Export == true ? 1 : 0); 
         RoleMapping.MenuRestrictedView = (rm.RestrictedView == true ? 1 : 0); 
         RoleMapping.MenuBulkUpdate = (rm.BulkUpdate == true ? 1 : 0); 
         RoleMapping.MenuBulkDelete = (rm.BulkDelete == true ? 1 : 0); 
         RoleMapping.MenuSpecial1 = (rm.Special1 == true ? 1 : 0); 
         RoleMapping.MenuSpecial2 = (rm.Special2 == true ? 1 : 0); 
         RoleMapping.MenuSpecial3 = (rm.Special3 == true ? 1 : 0); 
         RoleMapping.MenuSpecial4 = (rm.Special4 == true ? 1 : 0); 
         RoleMapping.MenuSpecial5 = (rm.Special5 == true ? 1 : 0); 

         db.RoleMenuMapping.Add(RoleMapping); 
        } 
       } 

       db.SaveChanges(); 

       ViewBag.RoleId = new SelectList(db.Role, "Id", "Code"); 
       ViewBag.Module = new SelectList(db.Module, "ModuleId", "ModuleName"); 
       ViewBag.ScreenType = new[] { new SelectListItem { Text = "Select", Value = "select" }, new SelectListItem { Text = "Master", Value = "1" }, new SelectListItem { Text = "Report", Value = "2" }, new SelectListItem { Text = "Transaction", Value = "3" } }; 

       return View("Index"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
      return Json(new { Result = "ERROR", Message = ex.Message }); 
     } 
    } 
+2

Где же именно появится это исключение? Какая линия? – Domysee

+0

Не уверен, на какой строке произошла ошибка, потому что журнал ошибок Elmah просто отображает это как ошибку. На самом деле меня попросили поработать над этим кодом, чтобы найти причину ошибки. –

+0

, если вы меняете 'return Json (new {Result =" ERROR ", Message = ex.Message});' to 'return Json (new {Result =" ERROR ", Message = ex.ToString()});' you возможно, сможет показать строку, где произошла ошибка. – WiiMaxx

ответ

1

Я думаю, проблема в этих двух строках

ViewBag.RoleId = new SelectList(db.Role, "Id", "Code"); 
ViewBag.Module = new SelectList(db.Module, "ModuleId", "ModuleName"); 

Вы отправляете DbSet с IEnumerable в конструктор SelectList. Если конструктор не выполняет итерацию прошедшего перечислимого и просто сохраняет его, то DbContext выходит за пределы области действия и выводится (из-за using (var db = ...), а ObjectDisposedException будет выбрасываться в любое время, когда перечислимое значение DbSet переименовано.

Я думаю, вы должны убедиться, что все, что вы используете из контекста db, материализовалось, прежде чем удалять контекст. Например, добавление ToList() или Select(...).ToList() как этот

ViewBag.RoleId = new SelectList(db.Role.ToList(), "Id", "Code"); 
ViewBag.Module = new SelectList(db.Module.ToList(), "ModuleId", "ModuleName"); 
+0

Большое спасибо. он работает для меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^