指定的LINQ表达式包含对与不同上下文关联的查询的引用

时间:2010-09-21 21:27:30

标签: asp.net-mvc entity-framework entity-framework-4 httpcontext

我在这段代码上遇到这个错误(这是我试图整合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"];
    }

1 个答案:

答案 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则不行。

我讨厌每次都打这个数据库,但我想我别无选择......至少目前我已经把所有事情都理顺了。