EF: перекрестный запрос linm-to -ites к edmx (та же БД) - PullRequest
1 голос
/ 24 мая 2011

Как я могу использовать два EDMX в отдельных сборках, но выше той же базы данных,
создать запрос linq-to-entity, который использует их оба?

* 1003 Е.Г. *

Вот что я пытаюсь сделать:

using (var context1 = new Entities1())
{
    using (var context2 = new Entities2())
    {
        var items2 = context2.Items.Where(item2 => item2.Color == "Red");

        var query = context1.Items.Where(item =>
            items2.Any(item2 => item2.PainterId == item.PainterId));
    }
}

> Это приводит к NotSupportedException.
Сообщение: «Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами.»

> Это исключение выдается, даже если Entities2 заменяется Entities1
(даже если оба контекста взяты из одного и того же EDMX) и оба используют одну и ту же строку подключения.


<Ч /> Для сравнения, с другой стороны, это работает и приводит к одному SQL-выражению:

using (var context1 = new Entities1())
{
    var items2 = context2.Items.Where(item2 => item2.Color == "Red");

    var query = context1.Items.Where(item =>
        items2.Any(item2 => item2.PainterId == item.PainterId));
}


Ограничения:

Мое намерение состоит в том, чтобы использовать два EDMX с поддержкой дизайнера - без взлома EDMX таким образом, который нарушает работу дизайнера или перезаписывается при обновлении из базы данных.

EDMX # 1 не может знать о EDMX # 2 (однако # 2 может знать о # 1).

Я хочу, чтобы результат преобразовывался в один запрос SQL, а не считывал результаты из первой части в память, а затем возвращал их в базу данных в качестве входных данных для второй части запроса.

1025 *
* <Ч />

Связано, но не то, что я ищу:

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Вы ограничили свои требования так, как отвечаете на ваш вопрос: нет, это невозможно.Лучшее и единственное рекомендуемое решение - вторая ссылка, в которой содержится ссылка на статью в блоге команды ADO.NET о работе с большими моделями.

Я написал о хаке (и я успешно использовал его в одном проекте), который также работает, но имеет другой недостаток - вы должны использовать один контекст для обоих EDMX.Даже если это сработало, я не рекомендую использовать этот способ, потому что у него могут быть неисследованные недостатки, потому что он внутренне пропускает имя контейнера, которое используется во многих других местах в EF.

0 голосов
/ 25 мая 2011

Еще один хак, который работает, объединяя два EDMX в третий, а затем создавая из него один ObjectContext, который обращается к обеим частям.

Все 3 EDMX должны будут использовать одно пространство имен.

Слияние может быть выполнено программно, результатом слияния должны быть: файлы EDMX, SSDL, CSDL, MSL;EDMX для T4 и другие для встраивания в качестве ресурсов.

Любые сущности и ассоциации, которые находятся в обоих исходных EDMX, должны иметь одно и то же определение (концептуальное и сопоставление).

Вы сможете запуститьзапросы к объединенному контексту EDMX, которые выполняются по обоим исходным EDMX, объединяются по идентификаторам или любым другим критериям.

Смотрите эту ссылку для получения дополнительной информации о подключении результатов: Как мне создать ObjectContext из отдельных файлов ssdl + csdl + msl и без edmx?

...