web-dev-qa-db-de.com

Entity Framework-Verbindungszeichenfolge nicht aus Konfig

public class Context : DbContext
{
    public Context(string connString) : base(connString) 
    {
        Database.SetInitializer(new MyContextInitializer());
    }
//...

Sie müssen eine Verbindungszeichenfolge an den Kontextkonstruktor übergeben. Wie sollte der String beispielsweise für SQL Compact aussehen? Versucht dies, aber kein Erfolg:

Context db = new Context("Provider=System.Data.SqlServerCe.4.0;Data Source=D:\\Context.sdf");

Bearbeiten:

Wenn ich diese Zeichenfolge probiere: "Data Source=D:\\Context.sdf"

System.Data.ProviderIncompatibleException wurde nicht behandelt

Message = Beim Abrufen von Providerinformationen aus der Datenbank ist ein Fehler aufgetreten.
Dies kann durch eine falsche Verbindungszeichenfolge bei Entity Framework verursacht werden. Überprüfen Sie die inneren Ausnahmen auf Details und stellen Sie sicher, dass die Verbindungszeichenfolge korrekt ist.

Source = EntityFramework

Und wenn ich versuche, den Anbieter so zu erwähnen: "Data Source=D:\\Context.sdf;provider=System.Data.SqlServerCe.4.0"

System.ArgumentException wurde nicht behandelt

Nachricht = Schlüsselwort wird nicht unterstützt: 'provider'.

Quelle = System.Data

19
Wonder

Ich hatte zuerst einen ähnlichen Fehler mit MVC 4-Code (während der Update-Datenbank). Der Fehler, den ich bekam:

Beim Abrufen der Anbieterinformationen aus der .__ ist ein Fehler aufgetreten. Datenbank. Dies kann durch ein falsches .__ von Entity Framework verursacht werden. Verbindungszeichenfolge. Überprüfen Sie die inneren Ausnahmen auf Details und stellen Sie sicher, dass dass die Verbindungszeichenfolge korrekt ist.

Es stellte sich heraus, dass mir einige wichtige Informationen in meiner web.config fehlten, damit alles mit localDB funktioniert. Hier sind die wichtigen Abschnitte (ich habe Referenzmaterial aus http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx ) verwendet. :

<configuration>
  <configSections>
   <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ESTdb-01;Integrated Security=true" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

Und hier ist meine gesamte web.config (ich verwende MVC 4, EF 4.3.1, EF-Migrations):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ESTdb-01;Integrated Security=true" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="true" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </sessionState>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>
8
ryanjones

Ich empfehle Ihnen, immer den EntityConnectionStringBuilder (System.Data.EntityClient) zu verwenden:

EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
ecsb.Provider = "System.Data.SqlServerCe.4.0";
ecsb.Metadata = "..."; // your metadata
ecsb.ProviderConnectionString = "Data Source=D:\\Context.sdf";

dann können Sie die Verbindungszeichenfolge auf einfache Weise generieren:

Context db = new Context(ecsb.ToString());

AKTUALISIEREN:

Versuchen Sie, die EntityConnection zu erstellen, und übergeben Sie sie statt der Verbindung an den Kontext:

EntityConnection conn = new EntityConnection(ecsb.ToString());
Context db = new Context(conn);

Wo befinden sich die Metadaten? Es wird von der EntityConnection benötigt!

5
tanathos

In meinem Fall (genau der gleiche Fehler) wurde es durch Ändern der Standardverbindungsfactory behoben:

Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

Lassen Sie den Verweis auf den Provider in Ihrer Verbindungszeichenfolge weg, da dies nicht erforderlich ist (auf diese Weise). Ich denke, ich habe gelesen, dass Database.DefaultConnectionFactory standardmäßig auf SqlConnectionFactory () gesetzt ist, aber ich kann keine Referenz dafür finden.

3
Sander

Ich hatte das gleiche Problem und es wurde gelöst durch:

1- Festlegen des Standardprojekts in der Manager-Konsole auf das Projekt, das die gewünschte web.config enthält 

2- Festlegen des Startprojekts für die Lösung auf dasselbe Projekt, damit der Aktualisierungsbefehl die Verbindungszeichenfolge finden kann.

0
Mai