Указанное выражение LINQ содержит ссылки на запросы, связанные с разными контекстами.

я получаю эту ошибку в этом коде (это проект 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. Будет ли это считаться двумя разными контекстами, даже если они указывают на одно и то же?

Пошаговое выполнение кода в отладчике показывает, что объекты контекста для двух репозиториев, consultDistrictsRepository и clientRepository, действительно указывают на один и тот же объект в объекте 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"];
    }

person Cynthia    schedule 21.09.2010    source источник
comment
Является ли clientRepository тем же самым, что и consultDistrictsRepository?   -  person Sander Rijken    schedule 22.09.2010
comment
Нет, это не так. Это два разных репозитория с двумя разными частными переменными контекста. Однако обе переменные контекста указывают на один и тот же объект контекста в объекте HttpContext.Current.   -  person Cynthia    schedule 22.09.2010
comment
Я обновил свой вопрос, чтобы добавить код, который я использую для инициализации объекта контекста. Я использую структуру Castle Windsor IoC, поэтому каждый репозиторий удаляется с каждым запросом. Я предполагаю, что объекты контекста также будут удалены. Но в любом случае объекты, на которые жалуется EF, находятся в одном и том же запросе — фактически в одном и том же вызове метода.   -  person Cynthia    schedule 22.09.2010


Ответы (1)


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

            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.

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

person Cynthia    schedule 21.09.2010
comment
Вам не нужно каждый раз обращаться к БД. Кэшируйте информацию в POCO, не являющемся сущностью, а не в сущности, и при необходимости передавайте скалярные значения в сущности. - person Craig Stuntz; 22.09.2010
comment
Да, на самом деле я не знаю, о чем я думал. Это было не кэширование содержимого списка клиентов, а только запроса, так что это было бессмысленно. EF до сих пор остается для меня загадкой. Огромная кривая обучения этой технологии. - person Cynthia; 22.09.2010