2010-11-30 12 views
3

Langzeithörer, Erstanrufer!Shared Hosting + Entity Framework + MySQL = Datenanbieter Fehler?

Ich versuche, mit dem ADO.NET Entity Framework eine Verbindung zu MySQL herzustellen. (Visual Studio 2010, .NET 4.0) Ich habe ein Webprojekt und ein anderes Klassenbibliotheksprojekt erstellt, das als meine DAL dienen soll. Auf meinem lokalen Rechner habe ich keine Probleme, und ich habe auch versucht, mit mittlerer Vertrauenswürdigkeit zu laufen. Ich bin in der Lage, die DB wie erwartet vollständig zu steuern.

Wenn ich jedoch auf meinem Host bereitstellen (geteilte, mittlere Vertrauensstellung), bekomme ich immer Fehler. Ich habe meine web.config mehrere Möglichkeiten gezwickt: Ich habe ausdrücklich meine Montage in der Verbindungszeichenfolge genannt, habe ich die Wildcard-Mapping verwendet, ich Verweise auf die MySQL-DLL hinzugefügt usw.


<connectionStrings> 
    <add name="NamespaceContext" connectionString="metadata=res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.csdl|res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.ssdl|res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient"/> 
    <add name=" NamespaceContext " connectionString="metadata=res://*/;provider=MySql.Data.MySqlClient;provider connection string=&quot; server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient"/> 
     <add name=" NamespaceContext " connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot; server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

der Fehler, den ich immer halten ist:

System.ArgumentException: The specified store provider cannot be found in the configuration, or is not valid. ---> 
System.ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed. 
at System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) 
at System.Data.EntityClient.EntityConnection.GetFactory(String providerString) 
--- End of inner exception stack trace --- 
at System.Data.EntityClient.EntityConnection.GetFactory(String providerString) 
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 
at System.Data.EntityClient.EntityConnection..ctor(String connectionString) 
at MyNamespace.Web.Html.TestPage.EntityFrameworkTestButton_Click(Object sender, EventArgs e) 

ich ihre Unterstützung Jungs gesprochen (die nicht devs sind), aber sie sagte, der MySQL-Anschluss installiert ist und im GAC. Ich versuchte, den DbProviderFactories Abschnitt in meinem web.config zu verwenden, wie die folgenden:

<system.data> 
    <DbProviderFactories> 
     <clear/> 
     <remove invariant="MySql.Data.MySqlClient"/> 
     <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> 
    </DbProviderFactories> 
    </system.data> 

Ich hatte gehofft, ich dies kontrollieren konnte und den Provider in meinem Projekt verweisen. Ich erhalte dann den folgenden Fehler:

System.Data.MetadataException: Schema specified is not valid. 
Errors: error 0194: All artifacts loaded into an ItemCollection must have the same version. Multiple versions were encountered. 
MySql.Data.Entity.Properties.SchemaDefinition-6.0.ssdl(4,9) : error 0169: All SSDL artifacts must target the same provider. The ProviderManifestToken '5' is different from '5.0' that was encountered earlier. 
error 0194: All artifacts loaded into an ItemCollection must have the same version. 

(viele der gleichen Fehlermeldung wurde der Kürze halber snipped)


ich bei einem vollständigen Verlust bin. Ich habe versucht, mein DAL-Projekt zu signieren, keine DAL zu verwenden und nur die .edmx im Webprojekt zu erstellen, alles ohne Erfolg. Ich hätte schwören können, dass es irgendwann funktionierte, aber vielleicht war ich im Delirium.

Entschuldigung für die Wand o 'Text. Kann jemand helfen oder etwas Licht abwerfen?

Danke!

Antwort

0

Was passiert, wenn Sie die mysql dll in Ihrem bin-Ordner ablegen? Versuchen Sie alternativ, die Versionsbeschränkung für die mysql-dll zu entfernen, da sie möglicherweise nicht die gleiche Version auf ihren Servern geladen haben.

+0

Ich habe die DLLs in meinem bin-Verzeichnis, aber kein Glück. Wie entferne ich die Versionsbeschränkung? Und wenn ich eine klare und entfernen, soll das dann nicht erlauben, meine Version zu verwenden? –

+0

verwenden Sie einfach type = "MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" anstatt die Vollversionsdaten anzugeben. Ändern Sie auch die Einstellung in Ihrem VS, um nicht gegen eine bestimmte Version zu erstellen – Cine

+0

Huzzah! Ich kann nicht glauben, dass ich auf etwas so Einfaches gestoßen bin!Vielen Dank, ich hatte keine Ahnung, dass du die Version einfach weglassen könntest! –

0

Ich hatte ein sehr ähnliches Problem in meiner Anwendung, wo ich den MySQL-Connector für eine MySQL-Datenbank und das Entity Framework für eine SQL Server-Datenbank (zwei separate Verbindungen, ein Projekt) verwendet. Die MySQL.Data.Entity-DLL scheint mit dem Entitätsframework zu kämpfen. Ich brauchte es eigentlich nicht, also entfernte ich es ... aber der Fehler blieb bestehen!

Schließlich aus der Verzweiflung Ich löschte nur meine bin und obj Ordner und neu kompiliert. Problem gelöst. Ich denke, etwas wurde in meinen Ordnern zwischengespeichert oder herumgehängt, selbst nachdem ich sauber gelaufen und neu aufgebaut habe. Etwas, um es trotzdem zu versuchen, wenn jemand anderes darauf reinkommt.