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

È necessario passare una stringa di connessione al costruttore di contesto. Come dovrebbe apparire la stringa, ad esempio, per SQL Compact? Abbiamo provato questo, ma senza successo:Entity Framework stringa di connessione non da config

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

Edit:

Se provo questa stringa: "Data Source=D:\\Context.sdf"

System.Data.ProviderIncompatibleException è stata gestita

message = Un errore si è verificato durante il recupero delle informazioni del provider dal database.
Questo può essere causato da Entity Framework che utilizza una stringa di connessione errata. Controlla le eccezioni interne per i dettagli e assicurati che la stringa di connessione sia corretta.

Source = EntityFramework

E se cerco di parlare il provider in questo modo: "Data Source=D:\\Context.sdf;provider=System.Data.SqlServerCe.4.0"

System.ArgumentException è stata gestita

Messaggio = Chiave non supportato: 'provider'.

Source = System.Data

+0

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

+0

@KrisIvanov, che non funziona. – Wonder

+0

Sarebbe utile fornire più dettagli di "nessun successo". –

risposta

5

vi consiglio di usare sempre l'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"; 

allora è possibile generare la stringa di connessione in modo semplice:

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

UPDATE:

tenta di creare l'EntityConnection, poi passarlo al contesto, invece di collegamento:

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

In ogni caso, dove sono i metadati? È richiesto da EntityConnection!

+0

Genera questa stringa: 'provider = System.Data.SqlServerCe.4.0; provider connection string =" Origine dati = D: \ Context.sdf "' e ottengo 'Argomento Eccezione: Parola chiave non supportata: 'provider'. – Wonder

+0

Ho aggiornato la mia risposta – tanathos

+0

Hmm, non ho alcun metadata per passare – Wonder

3

Nel mio caso (esattamente lo stesso errore) è stato risolto modificando la produzione connessioni predefinita:

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

Lasciare fuori qualsiasi riferimento al fornitore nella stringa di connessione, perché non è necessario (in questo modo) . Penso di aver letto che per impostazione predefinita Database.DefaultConnectionFactory è impostato su SqlConnectionFactory() ma non riesco a trovare un riferimento per questo.

8

Ho avuto un errore simile con il codice MVC 4 prima (durante l'esecuzione del database di aggiornamento). L'errore che stavo ottenendo:

Si è verificato un errore durante il recupero delle informazioni del provider dal database .Questo può essere causato da Entity Framework utilizzando una stringa di connessione errata . Controllare le eccezioni interne per i dettagli e garantire che la stringa di connessione sia corretta.

Si scopre che mi mancavano alcune informazioni cruciali nel mio web.config per far funzionare tutto con localDB. Ecco le sezioni importanti (io ho usato materiale di riferimento da 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> 

E per buona misura, ecco tutto il mio web.config (sto usando MVC 4, EF 4.3.1, EF-Migrazioni):

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

Quindi, quale parte (i) è importante? Perché utilizzare una stringa di connessione * e * una fabbrica di connessione predefinita? – user2246674

+0

Grazie. Non funziona ancora per me, ma lo sforzo di semplificare la soluzione è stato bello. – obesechicken13

0

ho avuto lo stesso problema ed è stato risolto:

1- l'impostazione del progetto predefinito nella console manager per il progetto che contiene il web.config desiderato

2- impostazione del progetto di avvio per la soluzione sullo stesso progetto affinché il comando di aggiornamento trovi la stringa di connessione.