構成ファイルの設定Configuration File Settings

Entity Framework では、構成ファイルからいくつかの設定を指定できます。Entity Framework allows a number of settings to be specified from the configuration file. 一般的な EF では、"構成よりも規約" の原則に従います。この投稿で説明されているすべての設定は既定の動作であるため、既定で要件を満たさなくなった場合にのみ設定を変更することを考慮する必要があります。In general EF follows a ‘convention over configuration’ principle: all the settings discussed in this post have a default behavior, you only need to worry about changing the setting when the default no longer satisfies your requirements.

コードベースの代替手段A Code-Based Alternative

これらの設定はすべて、コードを使用して適用することもできます。All of these settings can also be applied using code. EF6 以降では、コードから構成を適用するための一元的な方法を提供する コードベースの構成が導入されました。Starting in EF6 we introduced code-based configuration, which provides a central way of applying configuration from code. EF6 より前でも、構成はコードから適用できますが、さまざまな Api を使用してさまざまな領域を構成する必要があります。Prior to EF6, configuration can still be applied from code but you need to use various APIs to configure different areas. [構成ファイル] オプションを使用すると、コードを更新しなくても、配置時にこれらの設定を簡単に変更できます。The configuration file option allows these settings to be easily changed during deployment without updating your code.

Entity Framework 構成セクションThe Entity Framework Configuration Section

EF 4.1 以降では、構成ファイルの appSettings セクションを使用して、コンテキストのデータベース初期化子を設定できます。Starting with EF4.1 you could set the database initializer for a context using the appSettings section of the configuration file. EF 4.3 では、新しい設定を処理するためのカスタム Entityframework セクションが導入されました。In EF 4.3 we introduced the custom entityFramework section to handle the new settings. Entity Framework では、古い形式を使用して設定されたデータベース初期化子を引き続き認識しますが、可能な限り新しい形式に移行することをお勧めします。Entity Framework will still recognize database initializers set using the old format, but we recommend moving to the new format where possible.

Entityframework の NuGet パッケージをインストールすると、プロジェクトの構成ファイルに entityframework セクションが自動的に追加されました。The entityFramework section was automatically added to the configuration file of your project when you installed the EntityFramework NuGet package.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework"
       type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
</configuration>

接続文字列Connection Strings

このページ では、構成ファイル内の接続文字列など、使用するデータベースを Entity Framework によって決定する方法の詳細について説明します。This page provides more details on how Entity Framework determines the database to be used, including connection strings in the configuration file.

接続文字列は標準の connectionStrings 要素に含まれ、 entityframework セクションは必要ありません。Connection strings go in the standard connectionStrings element and do not require the entityFramework section.

Code First ベースのモデルでは、通常の ADO.NET 接続文字列を使用します。Code First based models use normal ADO.NET connection strings. 次に例を示します。For example:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>

EF デザイナーベースのモデルでは、特殊な EF 接続文字列を使用します。EF Designer based models use special EF connection strings. 次に例を示します。For example:

<connectionStrings>
  <add name="BlogContext"  
    connectionString=
      "metadata=
        res://*/BloggingModel.csdl|
        res://*/BloggingModel.ssdl|
        res://*/BloggingModel.msl;
      provider=System.Data.SqlClient;
      provider connection string=
        &quot;data source=(localdb)\mssqllocaldb;
        initial catalog=Blogging;
        integrated security=True;
        multipleactiveresultsets=True;&quot;"
     providerName="System.Data.EntityClient" />
</connectionStrings>

コードベースの構成の種類 (EF6 以降)Code-Based Configuration Type (EF6 Onwards)

EF6 以降では、アプリケーションの コードベースの構成 に使用する EF の dbconfiguration を指定できます。Starting with EF6, you can specify the DbConfiguration for EF to use for code-based configuration in your application. ほとんどの場合、EF によって自動的に DbConfiguration が検出されるため、この設定を指定する必要はありません。In most cases you don't need to specify this setting as EF will automatically discover your DbConfiguration. 構成ファイルで DbConfiguration を指定する必要がある場合の詳細については、「コードベースの構成」の「 Dbconfiguration の移動」セクションを参照してください。For details of when you may need to specify DbConfiguration in your config file see the Moving DbConfiguration section of Code-Based Configuration.

DbConfiguration 型を設定するには、 codeConfigurationType 要素にアセンブリ修飾型名を指定します。To set a DbConfiguration type, you specify the assembly qualified type name in the codeConfigurationType element.

注意

アセンブリ修飾名は、名前空間の修飾名の後にコンマを付け、その後に型が存在するアセンブリを指定します。An assembly qualified name is the namespace qualified name, followed by a comma, then the assembly that the type resides in. 必要に応じて、アセンブリのバージョン、カルチャ、および公開キートークンを指定することもできます。You can optionally also specify the assembly version, culture and public key token.

<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>

EF データベースプロバイダー (EF6 以降)EF Database Providers (EF6 Onwards)

EF6 より前は、データベースプロバイダーの Entity Framework 固有の部分をコア ADO.NET プロバイダーの一部として含める必要がありました。Prior to EF6, Entity Framework-specific parts of a database provider had to be included as part of the core ADO.NET provider. EF6 以降では、EF 固有の部分が管理され、個別に登録されるようになりました。Starting with EF6, the EF specific parts are now managed and registered separately.

通常、プロバイダーを自分で登録する必要はありません。Normally you won't need to register providers yourself. これは通常、プロバイダーをインストールするときに実行されます。This will typically be done by the provider when you install it.

プロバイダーは、 Entityframeworkセクションのproviders子セクションにプロバイダー要素を含めることによって登録されます。Providers are registered by including a provider element under the providers child section of the entityFramework section. プロバイダーエントリには、次の2つの必須の属性があります。There are two required attributes for a provider entry:

  • 示す invariantname は、この EF プロバイダーが対象とするコア ADO.NET プロバイダーを識別しますinvariantName identifies the core ADO.NET provider that this EF provider targets
  • type は、EF プロバイダーの実装のアセンブリ修飾型名です。type is the assembly qualified type name of the EF provider implementation

注意

アセンブリ修飾名は、名前空間の修飾名の後にコンマを付け、その後に型が存在するアセンブリを指定します。An assembly qualified name is the namespace qualified name, followed by a comma, then the assembly that the type resides in. 必要に応じて、アセンブリのバージョン、カルチャ、および公開キートークンを指定することもできます。You can optionally also specify the assembly version, culture and public key token.

例として、Entity Framework をインストールするときに既定の SQL Server プロバイダーを登録するために作成されたエントリを次に示します。As an example here is the entry created to register the default SQL Server provider when you install Entity Framework.

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

インターセプター (EF 6.1 以降)Interceptors (EF6.1 Onwards)

EF 6.1 以降では、構成ファイルにインターセプターを登録できます。Starting with EF6.1 you can register interceptors in the configuration file. インターセプターを使用すると、EF がデータベースクエリの実行や接続の開始などの特定の操作を実行するときに、追加のロジックを実行できます。Interceptors allow you to run additional logic when EF performs certain operations, such as executing database queries, opening connections, etc.

インターセプターは、 Entityframeworkセクションのインターセプター子セクションの下に****インターセプター要素を含めることによって登録されます。Interceptors are registered by including an interceptor element under the interceptors child section of the entityFramework section. たとえば、次の構成では、すべてのデータベース操作をコンソールに記録する組み込みの Databaselogger インターセプターが登録されます。For example, the following configuration registers the built-in DatabaseLogger interceptor that will log all database operations to the Console.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>

ファイルへのデータベース操作のログ記録 (EF 6.1 以降)Logging Database Operations to a File (EF6.1 Onwards)

構成ファイルを使用したインターセプターの登録は、問題のデバッグを支援するために、既存のアプリケーションにログ記録を追加する場合に特に便利です。Registering interceptors via the config file is especially useful when you want to add logging to an existing application to help debug an issue. Databaselogger では、ファイル名をコンストラクターパラメーターとして指定することによって、ファイルへのログ記録をサポートしています。DatabaseLogger supports logging to a file by supplying the file name as a constructor parameter.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
    </parameters>
  </interceptor>
</interceptors>

既定では、これにより、アプリが開始されるたびにログファイルが新しいファイルで上書きされます。By default this will cause the log file to be overwritten with a new file each time the app starts. 既に存在する場合は、ログファイルに追加するには、次のようにを使用します。To instead append to the log file if it already exists use something like:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
      <parameter value="true" type="System.Boolean"/>
    </parameters>
  </interceptor>
</interceptors>

Databaseloggerおよびインターセプターの登録の詳細については、ブログ投稿「 EF 6.1: 再コンパイルせずにログ記録を有効にする」を参照してください。For additional information on DatabaseLogger and registering interceptors, see the blog post EF 6.1: Turning on logging without recompiling.

既定の接続ファクトリの Code FirstCode First Default Connection Factory

[構成] セクションでは、コンテキストに使用するデータベースを検索するために使用 Code First 既定の接続ファクトリを指定できます。The configuration section allows you to specify a default connection factory that Code First should use to locate a database to use for a context. 既定の接続ファクトリは、コンテキストの構成ファイルに接続文字列が追加されていない場合にのみ使用されます。The default connection factory is only used when no connection string has been added to the configuration file for a context.

EF NuGet パッケージをインストールすると、インストールされているものに応じて、SQL Express または LocalDB を指す既定の接続ファクトリが登録されました。When you installed the EF NuGet package a default connection factory was registered that points to either SQL Express or LocalDB, depending on which one you have installed.

接続ファクトリを設定するには、 Defaultconnectionfactory 要素にアセンブリ修飾型名を指定します。To set a connection factory, you specify the assembly qualified type name in the defaultConnectionFactory element.

注意

アセンブリ修飾名は、名前空間の修飾名の後にコンマを付け、その後に型が存在するアセンブリを指定します。An assembly qualified name is the namespace qualified name, followed by a comma, then the assembly that the type resides in. 必要に応じて、アセンブリのバージョン、カルチャ、および公開キートークンを指定することもできます。You can optionally also specify the assembly version, culture and public key token.

独自の既定の接続ファクトリを設定する例を次に示します。Here is an example of setting your own default connection factory:

<entityFramework>
  <defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>

上の例では、カスタムファクトリにパラメーターなしのコンストラクターが必要です。The above example requires the custom factory to have a parameterless constructor. 必要に応じて、 parameters 要素を使用してコンストラクターのパラメーターを指定できます。If needed, you can specify constructor parameters using the parameters element.

たとえば、Entity Framework に含まれる SqlCeConnectionFactory では、プロバイダーの不変名をコンストラクターに指定する必要があります。For example, the SqlCeConnectionFactory, that is included in Entity Framework, requires you to supply a provider invariant name to the constructor. プロバイダー不変名は、使用する SQL Compact のバージョンを識別します。The provider invariant name identifies the version of SQL Compact you want to use. 次の構成では、コンテキストによって既定で SQL Compact バージョン4.0 が使用されます。The following configuration will cause contexts to use SQL Compact version 4.0 by default.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

既定の接続ファクトリを設定していない場合、Code First はを指す SqlConnectionFactory を使用し .\SQLEXPRESS ます。If you don’t set a default connection factory, Code First uses the SqlConnectionFactory, pointing to .\SQLEXPRESS. SqlConnectionFactory には、接続文字列の一部をオーバーライドできるコンストラクターも用意されています。SqlConnectionFactory also has a constructor that allows you to override parts of the connection string. 以外の SQL Server インスタンスを使用する場合は .\SQLEXPRESS 、このコンストラクターを使用してサーバーを設定できます。If you want to use a SQL Server instance other than .\SQLEXPRESS you can use this constructor to set the server.

次の構成では、明示的な接続文字列が設定されていないコンテキストに対して Code First が Mydatabaseserver を使用するようになります。The following configuration will cause Code First to use MyDatabaseServer for contexts that don’t have an explicit connection string set.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

既定では、コンストラクターの引数が文字列型であると想定されています。By default, it’s assumed that constructor arguments are of type string. Type 属性を使用してこれを変更できます。You can use the type attribute to change this.

<parameter value="2" type="System.Int32" />

データベース初期化子Database Initializers

データベース初期化子は、コンテキスト単位で構成されます。Database initializers are configured on a per-context basis. これらは、 コンテキスト 要素を使用して構成ファイルで設定できます。They can be set in the configuration file using the context element. この要素は、アセンブリ修飾名を使用して、構成されているコンテキストを識別します。This element uses the assembly qualified name to identify the context being configured.

既定では、Code First のコンテキストは、CreateDatabaseIfNotExists 初期化子を使用するように構成されています。By default, Code First contexts are configured to use the CreateDatabaseIfNotExists initializer. データベースの初期化を無効にするために使用できる、コンテキスト要素にdisabledatabaseinitialization属性があります。There is a disableDatabaseInitialization attribute on the context element that can be used to disable database initialization.

たとえば、次の構成では、Blog のデータベース初期化が無効になっています。 MyAssembly.dll で定義されているブログのコンテキストコンテキストです。For example, the following configuration disables database initialization for the Blogging.BlogContext context defined in MyAssembly.dll.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>

Databaseinitializer要素を使用して、カスタム初期化子を設定できます。You can use the databaseInitializer element to set a custom initializer.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
  </context>
</contexts>

コンストラクターのパラメーターは、既定の接続ファクトリと同じ構文を使用します。Constructor parameters use the same syntax as default connection factories.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
      <parameters>
        <parameter value="MyConstructorParameter" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

Entity Framework に含まれている汎用データベース初期化子のいずれかを構成できます。You can configure one of the generic database initializers that are included in Entity Framework. Type属性は、ジェネリック型の .NET Framework 形式を使用します。The type attribute uses the .NET Framework format for generic types.

たとえば、Code First Migrations を使用している場合は、初期化子を使用してデータベースを自動的に移行するように構成でき MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> ます。For example, if you are using Code First Migrations, you can configure the database to be migrated automatically using the MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> initializer.

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>