Wir verwenden EntityFramework 6 mit Code First. Wir haben eine Konsolenanwendung, die keinen Bezug zu EntityFramework hat, aber die Verbindungszeichenfolge aus ihrer App.config liest. Es ruft die DatabaseInitializationUtilities-Assembly auf, wobei die Verbindungszeichenfolge als Parameter übergeben wird.
DatabaseInitializationUtilities enthält den Verweis auf EF6 (EntityFramework und EntityFramework.SqlServer). Seine App.config lautet wie folgt:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAuthentication" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" />
</client>
</system.serviceModel>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Wenn die Ausführung eine Zeile erreicht, in der DatabaseInitializationUtilities versucht, ein Skript auszuführen
context.Database.ExecuteSqlCommand(script.ScriptText)
der Fehler wird ausgelöst:
Für den ADO.NET-Anbieter mit dem unveränderlichen Namen 'System.Data.SqlClient' wurde kein Entity Framework-Anbieter gefunden. Stellen Sie sicher, dass der Provider im Abschnitt "entityFramework" der Konfigurationsdatei der Anwendung registriert ist. Weitere Informationen finden Sie unter http://go.Microsoft.com/fwlink/?LinkId=260882 .
Ich glaube, das Mittel ist genau das, was ich in meiner Konfigurationsdatei habe, daher verstehe ich das Problem nicht.
ANMERKUNG: Resharper macht den Knoten bluelining und meldet "Das Element 'EntityFramework' hat ein ungültiges untergeordnetes Element 'provider'. Der Abschnitt wurde jedoch von NuGet eingefügt, als ich EF6 installierte.
Irgendwelche Ideen?
Sie müssen eine Referenz erstellen, damit sie in den Debug-Ordner kopiert wird. So kann später auf die Laufzeit zugegriffen werden.
Kopieren Sie keine Dateien, sondern erstellen Sie einfach diese Referenz:
private volatile Type _dependency;
public MyClass()
{
_dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
haben Sie die Assembly EntityFramework.SqlServer.dll in Ihrem Anwendungspfad?. Ich hatte das gleiche Problem und nach dem Kopieren der DLL in den Anwendungspfad funktionierte jedes Thing einwandfrei.
Endlich die Antwort in diesem Blog gefunden:
http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html
Ich hatte auch dieses Problem. Bei der Ausführung meiner .net mvc-App funktionierte alles lokal, aber als ich sie veröffentlichte, erhielt ich diesen Fehler. Das Problem war, dass ich auf EntityFrameworl.SqlServer auch in meinem Webprojekt verweisen musste, obwohl ich ein separates Projekt für Data hatte. Merkwürdig ist, dass dieser Fehler nur bei der Veröffentlichung der App ausgelöst wurde. Dies ist ein schwerwiegender Fehler, der wahrscheinlich von Microsoft stammt. Ich habe EF 6.1.1 verwendet.
Dies liegt daran, dass EntityFramework.SqlServer.dll
nicht in Ihr Projekt kopiert wird. Fügen Sie diese DLL hinzu und es wird hoffentlich funktionieren. Sie finden das in dem Projekt, in dem Sie das Datamodel hinzugefügt haben.
Für mich stellte sich heraus, dass mein Provider-Verweis in der Datei web.config nicht korrekt war. Ich glaube, dass das Nuget-Paket den Provider möglicherweise nicht richtig enthält.
Ich habe meinen Provider damit ersetzt und es hat funktioniert:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Fügen Sie "EntityFramework.SqlServer.dll" in Ihren Projektordner ein, um Ihr Problem zu beheben.
Ich neige dazu, EntityFramework dem Webprojekt sowie der Assembly hinzuzufügen, die tatsächlich darauf verweist.
Der beste Weg, ein solches Problem zu lösen, besteht darin, die Referenz EntityFramework.SqlServer.dll in Ihr Projekt aufzunehmen. Drücken Sie F4 (in den Eigenschaften) App wird in den veröffentlichten Ordner kopiert.