Entity Framework Code First : 既定以外のDBを指定する方法

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

Entity Framework Code First でデフォルト以外のデータベースを使用する方法をいくつか記載します。

Entity Framework Code First はデフォルトでは、 コンテキストクラスの名前空間.クラス名  をDB名、接続先SQL Server のインスタンス名が .\SQLEXPRESS となっています。下の例のForumContext クラスの場合は、DB名は既定で CodeFirst01.ForumContext になります。
構成ファイルや、コンストラクタを使用することで 接続先のSQL Serverインスタンスと、使用するDBを変更することができます。

namespace CodeFirst01 
{ 
    public class ForumContext : DbContext 
    { 
    } 
}

構成ファイルを使用する

構成ファイルを使用する例です。connectionStrings で name を コンテキストクラス名と同名にすると、プログラム内で、明示的に指定しなくても、自動的に接続文字列として使用してくれます。

<connectionStrings> 
  <add name="ForumContext" connectionString="Server=(local);Initial Catalog=Forum;Integrated Security=true" providerName="System.Data.SqlClient"/> 
</connectionStrings>

遅延ローディングを使用する場合、コーディングの仕方によっては、MARS を有効にする必要があります。multipleactiveresultsets=true を接続文字列に追加します。詳細は関連オブジェクトの読み込み (Entity Framework)参照

プログラム内でDB名や構成ファイル接続文字列名を指定する

ForumContext にDB名,接続文字列,および接続文字列名を受け入れるコンストラクタを用意することで、任意のDB名や接続文字列(名)を指定することができるようになります。

/// <summary> 
/// DB名,接続文字列または接続文字列名を引数に取るコンストラクタ 
/// </summary> 
/// <param name="nameOrConnectionString">DB名,接続文字列または接続文字列名</param> 
public ForumContext(string nameOrConnectionString) : base(nameOrConnectionString) 
{ 
}

プログラム内で、ForumContext に文字列を渡すと、その名前のDBもしくは接続文字列(名)を使用するようになります。コンストラクタの引数に指定した文字列に一致する接続文字列名が構成ファイルのconnectionStrings セクションに定義されている場合は接続文字列名と判断されます

using (ForumContext context = new ForumContext("SampleDB")) 
{}

構成ファイルで設定した接続文字列名であること明示的に示すには、 name=という文字列を接続文字列名の前につけてコンストラクタに渡します。

using (ForumContext context = new ForumContext("name=ForumContext")) 
{}

詳細は、DbContext のコンストラクタ を確認してください。APIリファレンスによると、DbConnectionをコンストラクタに渡して接続を共有することができることも記載してあります。

IDbConnectionFactoryを実装する

DB名や接続文字列が指定されない場合の既定の動作を決定しているのは Database.DefaultConnectionFactory です。通常 SqlConnectionFactory が使用されています。そのほか、Compact Edition用の SqlCeConnectionFactoryも用意されています。 Default.DefaultConnectionFactory に 新しい SqlConnectionFactory インスタンスを作成したり、IDbConnectionFactory を実装したカスタム ConectionFactory クラスを設定することで既定の振る舞いをカスタマイズできます。