我正在研究一個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?
那麼myc中的問題究竟是什麼? – 2015-03-25 11:35:36
不確定我對你的回覆有你的觀點... – 2015-03-25 14:02:31
使用block,當使用block時,會調用dispose和release連接。在你的情況下,你可以在控制器中創建連接並初始化字段,並保持該連接,儘管可能在某些操作中你甚至不使用該連接。因爲連接池是有限的,所以使用它並將它釋放給另一個。我看到你使用IDisposable,但我想知道爲什麼你不使用「使用」塊或調用處置任何地方。對不起,我的英語不好。 – 2015-03-25 14:46:27