Entity Framework CodeFirst:Database Initializer の動作を変更する

samatsu 7/9/2015 5681 N/A Code First

Entity Framework Code First では、既定では、 データベースがなければモデルに対応するデータベースを作成する CreateDatabaseIfNotExists(Of TContext) がデータベースイニシャライザに設定されています。最初にDataModelにアクセスするときに データベースイニシャライザのInitializeDatabase メソッドが呼び出されます。

振る舞いを変更するには、モデルが作成される前に、下記サンプルのように Database.SetInitializer メソッドを呼び出し、引数に IDatabaseInitializer を実装したクラスのインスタンスを設定します。

// モデルが変更されていたら データベースを作成し直すように Initializer を設定 
//System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ForumContext>()); 
//Database.SetInitializer(new CreateDatabaseIfNotExists<ForumContext>()); // 既定.DBがない場合にDBを作成する 
Database.SetInitializer(new DropCreateDatabaseAlways<ForumContext>()); // 初めてForumContext が作成されるときに必ずDBを作成する

標準で次のような初期化クラスが用意されています。

  • CreateDatabaseIfNotExists(Of TContext)
  • DropCreateDatabaseAlways(Of TContext)
  • DropCreateDatabaseIfModelChanges(Of TContext)

カスタムデータベースイニシャライザを使用する

IDatabaseInitializer(Of TContext) Interfaceを実装することで、カスタムイニシャライザを作成できます。

データベースイニシャライザを構成ファイルから指定する

アプリケーションの構成ファイルを使用して データベースイニシャライザ を設定できます。

<?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> 
  <entityFramework> 
    <contexts> 
      <context type="CodeFirst01.ForumContext, CodeFirst01"> 
        <databaseInitializer type="CodeFirst01.MyCustomBlogInitializer, CodeFirst01" /> 
      </context> 
    </contexts> 
  </entityFramework> 
</configuration>

Entity Framework 4.3 以降では上記以外も構成ファイルで設定が行えるようになっています。データベースの初期化の動作を無効にするには、次のように構成ファイルで設定します。

<?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> 
  <entityFramework> 
    <contexts> 
      <context type="CodeFirst01.ForumContext, CodeFirst01" disableDatabaseInitialization="true" /> 
    </contexts> 
  </entityFramework> 
</configuration>

EFで使用できる構成ファイル設定に関しては、構成ファイルの設定を参考にしてください。

EntityFramework 4.2 以前では、 appSettings でデータベースイニシャライザを指定していました。下記サンプル参照。

<?xml version="1.0"?> 
<configuration> 
<appSettings> 
<add key="DatabaseInitializerForType CodeFirst01.ForumContext, CodeFirst01" value="System.Data.Entity.DropCreateDatabaseIfModelChanges`1[[CodeFirst01.ForumContext, CodeFirst01]], EntityFramework" /> 
</appSettings> 
</configuration>