我在这段代码上遇到这个错误(这是我试图整合Entity Framework的MVC项目):
List<string> consultantSchoolList = new List<string>();
// districts managed by consultant
IQueryable<string> consultClients = rc.consultantDistrictsRepository.districtsForConsultant(userID);
// schools managed by consultant
if (consultClients != null)
{
consultantSchoolList = (from c in rc.clientsRepository.Clients
where (consultClients.Contains(c.cdsCode.Substring(0, 7)))
select c.cdsCode).ToList();
}
在“consultantSchoolList =”行。
这是一个MVC项目,我正在使用存储在HttpContext.Current对象中的上下文对象。每个存储库都有一个存储上下文对象的私有变量,但每个存储库都应指向HttpContext.Current Items集合中的同一对象。这会被认为是两种不同的背景,即使它们指向相同的东西吗?
单步调试器中的代码显示两个存储库的上下文对象consultantDistrictsRepository和clientsRepository确实指向HttpContext.Current对象中的同一对象。
更新以下是我在每个存储库中定义上下文对象的方法:
private SchedulerContext context;
public EFConsultantDistricts()
{
context = ContextHelper.GetContext();
}
和GetContext如下:
public static SchedulerContext GetContext()
{
if (!HttpContext.Current.Items.Contains("_db_context"))
{
HttpContext.Current.Items.Add("_db_context", new SchedulerContext());
}
return (SchedulerContext)HttpContext.Current.Items["_db_context"];
}
答案 0 :(得分:3)
我发现了问题 - 我在客户端存储库的Session变量中缓存了频繁请求的客户端列表:
if (HttpContext.Current.Session["clientList"] == null)
{
HttpContext.Current.Session["clientList"] = from c in context.Clients
where (c.Year == fiscalYear)
select c;
}
return (IQueryable<Client>)HttpContext.Current.Session["clientList"];
由于Session对象在请求上持续存在,我猜它正在使用以前的上下文对象。我认为客户端列表将与上下文对象分开,但我想如果我使用IQueryable则不行。
我讨厌每次都打这个数据库,但我想我别无选择......至少目前我已经把所有事情都理顺了。