public class Context : DbContext
{
public Context(string connString) : base(connString)
{
Database.SetInitializer(new MyContextInitializer());
}
//...
接続文字列をコンテキストコンストラクターに渡す必要があります。たとえば、SQL Compactの場合、文字列はどのように見えますか?これを試してみましたが、成功しませんでした:
Context db = new Context("Provider=System.Data.SqlServerCe.4.0;Data Source=D:\\Context.sdf");
編集:
この文字列を試してみると:"Data Source=D:\\Context.sdf"
System.Data.ProviderIncompatibleExceptionが処理されませんでした
Message =データベースからプロバイダー情報を取得中にエラーが発生しました。
これは、Entity Frameworkが誤った接続文字列を使用していることが原因である可能性があります。詳細について内部例外を確認し、接続文字列が正しいことを確認します。Source = EntityFramework
そして、このようなプロバイダーに言及しようとすると:"Data Source=D:\\Context.sdf;provider=System.Data.SqlServerCe.4.0"
System.ArgumentExceptionが処理されませんでした
メッセージ=キーワードはサポートされていません: 'provider'。
Source = System.Data
最初にMVC 4コードで同様のエラーが発生しました(update-databaseの実行中)。私が得ていたエラー:
データベースからプロバイダー情報を取得中にエラーが発生しました。これは、Entity Frameworkが誤った接続文字列を使用していることが原因である可能性があります。詳細について内部例外を確認し、接続文字列が正しいことを確認します。
LocalDBですべて動作させるために、web.configに重要な情報が欠けていたことがわかりました。ここに重要なセクションがあります( 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>
そして、良い測定のために、ここに私のweb.config全体があります(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>
常に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";
次に、簡単な方法で接続文字列を生成できます。
Context db = new Context(ecsb.ToString());
更新:
EntityConnectionを作成してから、接続の代わりにコンテキストに渡します:
EntityConnection conn = new EntityConnection(ecsb.ToString());
Context db = new Context(conn);
とにかく、メタデータはどこにありますか? EntityConnectionで必要です!
私の場合(まったく同じエラー)、デフォルトの接続ファクトリを変更することで解決しました。
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
接続文字列内のプロバイダーへの参照は必要ありません(この方法で)。 Database.DefaultConnectionFactoryがデフォルトでSqlConnectionFactory()に設定されていることを読んだと思いますが、そのリファレンスが見つかりません。
私は同じ問題を抱えていましたが、それは以下によって解決されました:
1-マネージャーコンソールの既定のプロジェクトを、目的のweb.configを含むプロジェクトに設定する
2-更新コマンドが接続文字列を見つけるために、同じプロジェクトにソリューションのスタートアッププロジェクトを設定します。