OUTER APPLY не поддерживается MySQL - PullRequest
5 голосов
/ 25 февраля 2010

Я использую Entity Framework с MySQL. Следующий запрос приводит к ошибке:

var foobar = ctx.ArticleBase.OfType<ActicleSpecial>().Include("CreatedBy.Image.Location").ToList();

Ошибка: «OUTER APPLY не поддерживается MySQL» Я также получаю «CROSS APPLY не поддерживается MySQL» по немного другому запросу.

У меня есть следующая модель данных: alt text

За исключением того, что сущность Image имеет сущность Location (отношение один ко многим) с именем Location location и UserBase имеет отношение Image вместо UserSpecial.

Почему я получаю эту ошибку? Как избежать этой ошибки? Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Это функция внутренней архитектуры Entity Framework. Иногда он генерирует запросы, не поддерживаемые поставщиками, кроме SQL Server. Более подробная информация доступна здесь, на MSDN .

3 голосов
/ 25 февраля 2010

Если эта ошибка исходит от MySQL, произошло одно из двух:

  1. Вы неправильно настроили провайдера.
  2. В вашем провайдере EF есть ошибка.

Если эта ошибка исходит от вашего провайдера MySQL EF, то произошло одно из двух:

  1. Вы неправильно настроили провайдера.
  2. У вашего провайдера EF есть ограничение.

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

Возможно, что некоторые механизмы хранения MySQL поддерживают функции SQL, которые другие не поддерживают. В этом случае провайдеру потребуется либо использовать общее подмножество функций, поддерживаемых большинством механизмов, либо использовать ProviderManifestToken, чтобы вы могли выбрать.

Однако также возможно, что провайдер с ошибками просто возвращает неверный SQL. Если это так, то вы должны либо найти обновление, либо избегать запросов, которые касаются ошибки.

Обновление: Судя по ответу @ Devart, кажется, что это ограничение провайдера, который разработан из-за ограничений MySQL. EF создаст каноническое дерево команд ADO.NET. Поставщик несет ответственность за перевод этого на SQL. Если EF возвращает перекрестный / внешний узел применения в CCT, кажется, что Devart не нашел способа перевести это в SQL, который может обрабатывать MySQL. Так что либо MySQL просто не справляется с задачей поддержки всех запросов EF, либо кто-то, кто является экспертом MySQL (не я!), Должен показать Devart, как создавать MySQL-совместимый SQL, который может правильно возвращать строки для перекрестного / внешнего применения. Узлы CCT.

...