Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами. - PullRequest
2 голосов
/ 22 сентября 2010

я получаю эту ошибку в этом коде (это проект MVC, в который я пытаюсь интегрировать Entity Framework):

        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 Ответ

3 голосов
/ 22 сентября 2010

Я обнаружил проблему - я кэшировал список часто запрашиваемых клиентов в переменной Session в репозитории Clients:

            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.

Я ненавижу каждый раз попадать в базу данных для этого, но, думаю, у меня нет выбора ... по крайней мере, пока я все не улажу.

...