2010-02-25 3 views
5

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

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

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

У меня есть следующий DataModel: alt text http://i48.tinypic.com/5x4kdc.jpg

За исключением объекта изображения имеют Местонахождение объект (один ко многим) относительно имени Расположение отношение и UserBase имеют отношение изображения вместо UserSpecial.

Зачем нужна эта ошибка? Как избежать этой ошибки? Является ли это возможным?

+0

его не поддерживает Oracle :( – gbjbaanb

+0

+1 для графики – thomaspaulb

ответ

3

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

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

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

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

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

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

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

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

+0

Извините, Крейг, вы ошибаетесь. Это не ошибка конфигурации, а ошибка в поставщике MySQL EF. – Devart

+0

Пожалуйста, прочитайте статью, которую вы связали. нет такой вещи. –

+2

Вот цитата: «В некоторых случаях конвейер запросов может содержать оператор Transact-SQL, содержащий операторы CROSS APPLY и/или OUTER APPLY. Поскольку некоторые серверные поставщики, включая версии SQL Server раньше, чем SQL Server 2005, не используют поддерживают эти операторы, такие запросы не могут выполняться на этих бэкэнд-провайдерах ». Это дело Петра. Мы связались с Microsoft по этой проблеме, и ответ был отрицательным - эта функциональность не должна изменяться. – Devart

3

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

+1

Это неправильно. В статье, которую вы указываете, описаны «Известные проблемы в поставщике данных .NET Framework ** для SQL Server (SqlClient) ** для платформы Entity Framework»). (Добавлен акцент.) Простой факт состоит в том, что ** все ** генерация SQL в EF выполняется поставщиком, * не * самой EF. –

+0

Так что же верно? Если поставщик генерирует SQL, то, очевидно, в вашем провайдере есть ошибка в MySQL. Почему вы используете Cross Apply или Outer Apply с MySQL? Как написать запрос, чтобы избежать этой проблемы? Мне нужно что-то установить в разъеме Devart? –

+3

SQL генерируется из дерева выражений, заданного конвейером запросов EF. Если дерево уже содержит OUTER APPLY, нет способа избавиться от него в провайдере. – Devart

Смежные вопросы