2012-03-06 21 views
19
public class Context : DbContext 
{ 
    public Context(string connString) : base(connString) 
    { 
     Database.SetInitializer(new MyContextInitializer()); 
    } 
//... 

Necesita pasar una cadena de conexión al constructor de contexto. ¿Cómo debería ser la cadena, por ejemplo, para SQL Compact? Intentado esto, pero sin éxito:cadena de conexión de Entity Framework no desde la configuración

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

Editar:

Si trato de esta cadena: "Data Source=D:\\Context.sdf"

System.Data.ProviderIncompatibleException fue controlada

message = un error ocurrió al obtener información del proveedor de la base de datos.
Esto puede ser causado por Entity Framework utilizando una cadena de conexión incorrecta. Consulte las excepciones internas para obtener más información y asegúrese de que la cadena de conexión sea correcta.

Fuente = ADO.NET Entity Framework

Y si trato de mencionar el proveedor de la siguiente manera: "Data Source=D:\\Context.sdf;provider=System.Data.SqlServerCe.4.0"

System.ArgumentException fue controlada

Mensaje = palabra clave no es compatible: 'proveedor'.

Fuente = System.Data

+0

http://msdn.microsoft.com/en-us/library/bb738533.aspx –

+0

@KrisIvanov, eso no funciona. – Wonder

+0

Ayudaría a proporcionar más detalles que "sin éxito". –

Respuesta

5

Sugiero que usted utilice siempre el 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"; 

entonces usted puede generar la cadena de conexión de una manera sencilla:

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

ACTUALIZACIÓN:

intenta crear la EntityConnection, luego pasarlo al contexto, en lugar de conexión:

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

De todos modos, en donde son los metadatos? ¡Es requerido por EntityConnection!

+0

Genera esta cadena: 'provider = System.Data.SqlServerCe.4.0; provider connection string =" Data Source = D: \ Context.sdf "' y obtengo 'Argument Exception: Keyword not supported: 'provider'. – Wonder

+0

He actualizado mi respuesta – tanathos

+0

Hmm, no tengo ningún metadato para pasar – Wonder

3

En mi caso (exactamente el mismo error) se resolvió cambiando la fábrica de conexiones por defecto:

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

Dejar de lado cualquier referencia al proveedor en su cadena de conexión, ya que no es necesario (de esta manera) . Creo que leí que, de manera predeterminada, Database.DefaultConnectionFactory está establecido en SqlConnectionFactory() pero no puedo encontrar una referencia para eso.

8

Tuve un error similar con el código MVC 4 primero (mientras ejecutaba la actualización de la base de datos). El error que estaba recibiendo:

Ha ocurrido un error al obtener información del proveedor de la base de datos .Esto puede ser causado por Entity Framework utilizando una cadena de conexión incorrecta. Consulte las excepciones internas para obtener más información y asegúrese de que la cadena de conexión es correcta.

Resulta que me faltaba información crucial en mi web.config para que todo funcione con localDB. He aquí las secciones importantes (utilicé material de referencia 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> 

Y por si acaso, aquí está toda mi web.config (estoy usando MVC 4, EF 4.3.1, EF-Migraciones):

<?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> 
+2

Entonces, ¿qué parte (s) son importantes? ¿Por qué usar una cadena de conexión * y * una fábrica de conexión predeterminada? – user2246674

+0

Gracias. Todavía no funciona para mí, pero el esfuerzo por simplificar la solución fue agradable. – obesechicken13

0

que tenían el mismo problema y se ha resuelto por:

1- establecer el proyecto predeterminado en la consola de administrador para el proyecto que contiene el web.config deseada

2- establecer el proyecto de inicio para la solución al mismo proyecto para que el comando de actualización encuentre la cadena de conexión.

Cuestiones relacionadas