2010-02-25 3 views
5

Ich verwende Entity Framework mit MySQL. Die folgende Abfrage ergibt einen Fehler:OUTER APPLY wird von MySQL nicht unterstützt

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

Fehler: „OUTER APPLY wird von MySQL nicht unterstützt“ Ich habe auch die „CROSS APPLY wird von MySQL nicht unterstützt“ auf eine wenig anderen Abfrage.

Ich habe folgendes Datenmodell: alt text http://i48.tinypic.com/5x4kdc.jpg

Außer der Bildeinheit hat Location Entität (one to many Beziehung) mit dem Namen Lage Beziehung und Userbase Bild Beziehung haben statt UserSpecial.

Warum bekomme ich diesen Fehler? Wie vermeide ich diesen Fehler? Ist es möglich?

+0

seine nicht von Oracle unterstützt :( – gbjbaanb

+0

+1 für die Grafik – thomaspaulb

Antwort

3

Wenn dieser Fehler kommt von MySQL eines von zwei Dingen geschehen:

  1. Sie haben nicht den Provider korrekt konfiguriert ist.
  2. Ihr EF-Anbieter hat einen Fehler.

Wenn diese Fehler von MySQL-EF-Provider kommen, dann eines von zwei Dingen geschehen:

  1. Sie haben die Provider nicht richtig konfigurieren.
  2. Es gibt eine Einschränkung in Ihrem EF-Anbieter.

SQL wird vom Anbieter generiert. Sie können die serverversionsspezifische SQL-Generierung über die ProviderManifestToken attribute in EDMX konfigurieren. Auf diese Weise weisen Sie den Provider an, keine SQL-Funktionen zu verwenden, die ältere Serverversionen nicht unterstützen.

Es ist möglich, dass einige MySQL-Speicher-Engines SQL-Funktionen unterstützen, andere nicht. In diesem Fall müsste der Anbieter entweder eine gemeinsame Teilmenge der von den meisten Engines unterstützten Funktionen verwenden oder ProviderManifestToken verwenden, um die Auswahl zu ermöglichen.

Es ist jedoch auch möglich, dass ein fehlerhafter Anbieter einfach falsches SQL zurückgibt. Wenn dies der Fall ist, müssen Sie entweder ein Update finden oder Anfragen vermeiden, die den Fehler betreffen.

Update: Basierend auf @ Devart Antwort, so scheint es, dass dies eine Einschränkung seitens des Providers ist, die aufgrund der Beschränkungen von MySQL ausgelegt ist. Die EF erstellt einen kanonischen ADO.NET-Befehlsbaum. Es liegt in der Verantwortung des Providers, dies in SQL zu übersetzen. Wenn die EF einen Cross/Outer-Apply-Knoten in der CCT zurückgibt, scheint Devart keine Möglichkeit gefunden zu haben, dies in SQL zu übersetzen, mit dem MySQL umgehen kann. Entweder ist MySQL einfach nicht in der Lage, alle EF-Abfragen zu unterstützen, oder jemand, der ein MySQL-Experte ist (nicht ich!), Muss Devart zeigen, wie MySQL-kompatibles SQL erzeugt wird, das Zeilen für das Cross/Outer-Apply korrekt zurückgibt CCT-Knoten.

+0

Sorry, Craig, Sie sind falsch. Das ist weder Konfigurationsfehler, noch der Fehler in MySQL EF-Anbieter. – Devart

+0

Lesen Sie bitte den Artikel, den Sie verknüpft. Es sagt keine solche Sache. –

+2

Hier ein Zitat: "In einigen Fällen kann die Abfragepipeline eine Transact-SQL-Anweisung erzeugen, die CROSS APPLY- und/oder OUTER APPLY-Operatoren enthält. Weil einige Backend-Provider, einschließlich Versionen von SQL Server vor SQL Server 2005, dies nicht tun unterstützen diese Operatoren, können solche Abfragen nicht auf diesen Backend-Providern ausgeführt werden. " Das ist der Fall von Peter. Wir hatten Microsoft zu diesem Problem kontaktiert und die Antwort war negativ - diese Funktionalität soll nicht geändert werden. – Devart

3

Dies ist eine interne Architekturfunktion von Entity Framework. Manchmal generiert es Abfragen, die nicht von anderen Anbietern als SQL Server unterstützt werden. Weitere Informationen sind verfügbar here at MSDN. entweder

+1

Das ist falsch. Der Artikel, den Sie verknüpfen, beschreibt "Bekannte Probleme in dem .NET Framework Data ** Provider für SQL Server (SqlClient) ** für das Entity Framework)". (Hervorhebung hinzugefügt.) Die einfache Tatsache ist, dass ** alle ** SQL-Generierung in der EF vom Provider durchgeführt wird, * nicht * die EF selbst. –

+0

Also was ist wahr? Wenn der Provider ein SQL generiert, dann ist offensichtlich ein Fehler in Ihrem Provider zu MySQL. Warum verwenden Sie dann Cross Apply oder Outer Apply mit MySQL? Wie sollte ich eine Abfrage schreiben, um dieses Problem zu vermeiden? Muss ich etwas im Devart-Anschluss setzen? –

+3

SQL wird aus der Ausdrucksstruktur generiert, die von der EF-Abfragepipeline angegeben wird. Wenn der Baum bereits OUTER APPLY enthält, gibt es keine Möglichkeit, ihn im Provider loszuwerden. – Devart