2015-03-25 36 views
0

我正在研究一個asp.net mvc 5.2 web應用程序+實體框架6.我已經定義了兩個存儲庫兩個實體; SecurityRole和工作人員,然後我把它們之間定義的工作單位如下: -UnitofWork + DependencyResolver在調用.Save()時會引發異常「兩個對象之間的關係無法定義」

public class UnitOfWork : IDisposable 
    { 
     private SkillManagementEntities context = new SkillManagementEntities(); 
     private SkillRepository skillRepository; 
     private StaffRepository staffRepository; 
     private SecurityRoleRepository securityroleRepository; 
     private CustomerRepository customerRepository; 
     private SkillVersionHistoryRepository SVH; 
     private LinkToKBRepository linkToKBRepository; 
     public SkillRepository SkillRepository 
     { 
      get 
      { 

       if (this.skillRepository == null) 
       { 
        this.skillRepository = new SkillRepository(context); 
       } 
       return skillRepository; 
      } 
     } 

     public StaffRepository StaffRepository 
     { 
      get 
      { 

       if (this.staffRepository == null) 
       { 
        this.staffRepository = new StaffRepository(context); 
       } 
       return staffRepository; 
      } 
     } 

     public SecurityRoleRepository SecurityRoleRepository 
     { 
      get 
      { 

       if (this.securityroleRepository == null) 
       { 
        this.securityroleRepository = new SecurityRoleRepository(context); 
       } 
       return securityroleRepository; 
      } 
     } 

     public async Task Save() 
     { 
      await context.SaveChangesAsync(); 
     } 

     private bool disposed = false; 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing) 
       { 
        context.Dispose(); 
       } 
      } 
      this.disposed = true; 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
    } 
} 
現在SecurityRole控制器我有以下的操作方法,給職工分配給安全角色裏面

: -

public class SecurityRoleController : Controller 
    { 

    UnitOfWork uniteofwork = new UnitOfWork(); 
[HttpPost] 
     [ValidateAntiForgeryToken] 

     public async Task<ActionResult> AssignStaffsToSR(int? id , int[] selectedStaffsids) 
     { 


      var dbsecurityrole = new SecurityRole(); 
      try 
      { 

       dbsecurityrole = await uniteofwork.SecurityRoleRepository.FindSecurityRole(id.Value,sr=>sr.Staffs); 
       uniteofwork.SecurityRoleRepository.UpdateSecurityRoleUsers(selectedStaffsids, dbsecurityrole); 
       await uniteofwork.Save(); 
       TempData["message"] = string.Format("{0} User/s have been Assigned", String.Empty); 
       if (Request.IsAjaxRequest()) 
       { 
        return Json(new { ISsuccess = true }); 
       } 

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


      } 
      catch (Exception e) 
      { 
       ModelState.AddModelError(string.Empty, "Error occured"); 
      } 



       return View(await uniteofwork.SecurityRoleRepository.populateAssignStaff(dbsecurityrole)); 
      } 

其中調用以下庫方法: -

public class SecurityRoleRepository : ISecurityRoleRepository , IDisposable 
     { 
     private SkillManagementEntities context; 
     private IStaffRepository staffrepo = (IStaffRepository)DependencyResolver.Current.GetService(typeof(IStaffRepository)); 
     public SecurityRoleRepository(SkillManagementEntities context) 
      { 
       this.context = context; 
      } 
public void UpdateSecurityRoleUsers(int[] selectedUsers, SecurityRole securityRole) 
       { 
        var dbSecurityRolestaffs = securityRole.Staffs.ToList(); 
        var activestaffs = staffrepo.GetActiveStaff().ToList(); 

        foreach (var s in activestaffs) 
        { 

         if (selectedUsers.Contains(s.StaffID)) 
         { 
          if (!dbSecurityRolestaffs.Any(a => a.StaffID == s.StaffID)) 
          { 

           securityRole.Staffs.Add(s); 
          } 
         } 
         else 
         { 
          if (dbSecurityRolestaffs.Any(a => a.StaffID == s.StaffID)) 
          { 
           securityRole.Staffs.Remove(s); 
          } 



         } 
        } 

       } 

,我已經定義了存儲庫之間的以下依賴解析器: -

public class YourDependencyResolverClass : IDependencyResolver 
{ 
    private IKernel kernel; 

    public YourDependencyResolverClass() 
    { 
     kernel = new StandardKernel(); 
     AddBindings(); 
    } 

    public object GetService(Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 
    } 
    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 
    } 


    private void AddBindings() 
    { 
     kernel.Bind<ISkillRepository>().To<SkillRepository>(); 
     kernel.Bind<IStaffRepository>().To<StaffRepository>(); 
     kernel.Bind<ISecurityRoleRepository>().To<SecurityRoleRepository>(); 
     kernel.Bind<ICustomerRepository>().To<CustomerRepository>(); 
     kernel.Bind<ISkillVersionHistoryRepository>().To<SkillVersionHistoryRepository>(); 
    } 

,但目前當我打電話await uniteofwork.Save();我的操作方法裏面我得到了以下異常: -

無法定義的兩個對象之間的關係,因爲 它們連接到不同的ObjectContext的對象。

雖然我使用UnitofWork類應該在存儲庫和實體之間傳遞相同的objectcontext?

回答

1

UnitOfWork uniteofwork = new UnitOfWork(); - >始終創建連接,那麼當你需要打開連接,不使用這樣的

using(UnitOfWork unitOfWork = new UnitOfWork()){ 
    unitOfWork.YourRepository.DoStuff(); 
    unitOfWork.Save(); 
} 

也許您的問題就在這裏:(IStaffRepository)DependencyResolver.Current.GetService(typeof(IStaffRepository)); 這將讓StaffRepository你和背景不同。

你可以嘗試解決這個問題,但我不推薦這種方式,因爲代碼不好。

private IStaffRepository staffrepo; 
public SecurityRoleRepository(SkillManagementEntities context) 
{ 
     this.context = context; 
     staffrepo = new StaffRepository(context); 
} 
+0

那麼myc中的問題究竟是什麼? – 2015-03-25 11:35:36

+0

不確定我對你的回覆有你的觀點... – 2015-03-25 14:02:31

+0

使用block,當使用block時,會調用dispose和release連接。在你的情況下,你可以在控制器中創建連接並初始化字段,並保持該連接,儘管可能在某些操作中你甚至不使用該連接。因爲連接池是有限的,所以使用它並將它釋放給另一個。我看到你使用IDisposable,但我想知道爲什麼你不使用「使用」塊或調用處置任何地方。對不起,我的英語不好。 – 2015-03-25 14:46:27

相關問題