web-dev-qa-db-fra.com

Chaîne de connexion Entity Framework non issue de la configuration

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

Besoin de passer une chaîne de connexion au constructeur de contexte. A quoi devrait ressembler la chaîne, par exemple, pour SQL Compact? Essayé cela, mais sans succès:

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

Modifier:

Si j'essaye cette chaîne: "Data Source=D:\\Context.sdf"

System.Data.ProviderIncompatibleException n'a pas été gérée

Message = Une erreur s'est produite lors de l'obtention des informations sur le fournisseur de la base de données.
Cela peut être dû à Entity Framework utilisant une chaîne de connexion incorrecte. Vérifiez les exceptions internes pour plus de détails et assurez-vous que la chaîne de connexion est correcte.

Source = EntityFramework

Et si j'essaie de mentionner le fournisseur comme ceci: "Data Source=D:\\Context.sdf;provider=System.Data.SqlServerCe.4.0"

System.ArgumentException non gérée

Message = Mot clé non pris en charge: 'fournisseur'.

Source = System.Data

19
Wonder

J'ai eu une erreur similaire avec le code MVC 4 en premier (lors de l'exécution de update-database). L'erreur que je devenais:

Une erreur s'est produite lors de l'obtention des informations sur le fournisseur à partir du fichier base de données. Cela peut être dû à Entity Framework qui utilise un .__ incorrect. chaîne de connexion. Vérifiez les exceptions internes pour plus de détails et assurez-vous que que la chaîne de connexion est correcte.

Il s'avère qu'il me manquait des informations cruciales dans mon Web.config pour que tout fonctionne avec localDB. Voici les sections importantes (j'ai utilisé le matériel de référence de http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx ) :

<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>

Et pour faire bonne mesure, voici tout mon web.config (j'utilise 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

Je vous suggère de toujours utiliser EntityConnectionStringBuilder (System.Data.EntityClient):

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

alors vous pouvez générer la chaîne de connexion d'une manière simple:

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

METTRE À JOUR:

Essayez de créer EntityConnection, puis transmettez-le au contexte, au lieu de la connexion:

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

Quoi qu'il en soit, où sont les métadonnées? C'est requis par EntityConnection!

5
tanathos

Dans mon cas (exactement la même erreur), cela a été résolu en changeant la fabrique de connexions par défaut:

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

Oubliez toute référence au fournisseur dans votre chaîne de connexion car cela n'est pas nécessaire (de cette façon). Je pense avoir lu que, par défaut, Database.DefaultConnectionFactory est défini sur SqlConnectionFactory (), mais je ne trouve pas de référence pour cela.

3
Sander

J'ai eu le même problème et il a été résolu par:

1- Définition du projet par défaut dans la console du gestionnaire sur le projet contenant le fichier Web.config souhaité 

2- définir le projet de démarrage de la solution sur le même projet afin que la commande de mise à jour trouve la chaîne de connexion.

0
Mai