接続文字列とモデル

このトピックでは、使用するデータベース接続が Entity Framework で検出される方法と、それを変更する方法について説明します。 このトピックでは、Code First と EF Designer の両方を使用して作成され.るモデルについて説明します。

通常、Entity Framework アプリケーションでは、DbContext から派生したクラスが使用されます。 この派生クラスは、基底の DbContext クラスでコンストラクターの 1 つを呼び出して次を制御します。

  • コンテキストがデータベースに接続する方法、つまり、接続文字列の検出または使用方法
  • コンテキストで、Code First を使用して計算されたモデルが使用されるか、EF Designer を使用して作成されたモデルが読み込まれるか
  • その他の詳細オプション

次のフラグメントでは、DbContext コンストラクターを使用できるいくつかの方法を示します。

規則による接続で Code First を使用する

アプリケーションで他の構成を行ったことがない場合、DbContext でパラメーターなしのコンストラクターを呼び出すと、DbContext は、規則によって作成されたデータベース接続を使用して Code First モードで実行されます。 次に例を示します。

namespace Demo.EF
{
    public class BloggingContext : DbContext
    {
        public BloggingContext()
        // C# will call base class parameterless constructor by default
        {
        }
    }
}

この例で、DbContext は、派生コンテキスト クラス (Demo.EF.BloggingContext) の名前空間修飾名をデータベース名として使用し、SQL Express または LocalDB のいずれかを使用してこのデータベースの接続文字列を作成します。 両方がインストールされている場合は、SQL Express が使用されます。

Visual Studio 2010 には SQL Express が既定で含まれており、Visual Studio 2012 以降には LocalDB が含まれています。 インストール中、EntityFramework NuGet パッケージによって、使用できるデータベース サーバーが確認されます。 次に、NuGet パッケージにより、規則に従って接続を作成するときに Code First で使用される既定のデータベース サーバーが設定されて、構成ファイルが更新されます。 SQL Express が実行されている場合は、それが使用されます。 SQL Express が使用できない場合は、代わりに LocalDB が既定として登録されます。 既定の接続ファクトリの設定が既に含まれている場合は、構成ファイルに対する変更は行われません。

規則による接続と指定されたデータベース名で Code First を使用する

アプリケーションで他に構成を行っていない場合は、使用するデータベース名を指定して DbContext で文字列コンストラクターを呼び出すと、DbContext は、規則によって作成されたその名前のデータベースへのデータベース接続を使用して、Code First モードで実行されます。 次に例を示します。

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingDatabase")
    {
    }
}

この例で、DbContext はデータベース名として "BloggingDatabase" を使用し、SQL Express (Visual Studio 2010 でインストールされる) または LocalDB (Visual Studio 2012 でインストールされる) のいずれかを使用して、このデータベースの接続文字列を作成します。 両方がインストールされている場合は、SQL Express が使用されます。

app.config または web.config ファイル内の文字列を使って Code First を使用する

app.config または web.config ファイルに接続文字列を入れることを選択できます。 次に例を示します。

<configuration>
  <connectionStrings>
    <add name="BloggingCompactDatabase"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=Blogging.sdf"/>
  </connectionStrings>
</configuration>

これは、SQL Express または LocalDB 以外のデータベース サーバーを使用することを DbContext に示す簡単な方法です。上記の例では、SQL Server Compact Edition データベースが指定されています。

接続文字列の名前が (名前空間の修飾の有無に関係なく) コンテキストの名前と一致すると、パラメーターなしのコンストラクターが使用されている場合は DbContext によって検出されます。 接続文字列名がコンテキストの名前と異なる場合は、接続文字列名を DbContext コンストラクターに渡して、Code First モードでこの接続を使用することを DbContext に指示できます。 次に例を示します。

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingCompactDatabase")
    {
    }
}

または、DbContext コンストラクターに渡される文字列に対して "name=<connection string name>" の形式を使用できます。 次に例を示します。

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("name=BloggingCompactDatabase")
    {
    }
}

この形式により、接続文字列が構成ファイルに含まれることを予期していることが明示的になります。 指定した名前の接続文字列が見つからない場合は、例外がスローされます。

app.config または web.config ファイル内の文字列が使用されるデータベースまたは Model First

EF Designer を使用して作成されるモデルは、モデルは既に存在しており、アプリケーションの実行時にコードから生成されないという点で、Code First とは異なります。 通常、モデルはプロジェクト内に EDMX ファイルとして存在します。

Designer によって EF 接続文字列が app.config または web.config ファイルに追加されます。 この接続文字列は、EDMX ファイル内での情報の検出方法に関する情報が含まれているという点において特殊です。 次に例を示します。

<configuration>  
  <connectionStrings>  
    <add name="Northwind_Entities"  
         connectionString="metadata=res://*/Northwind.csdl|  
                                    res://*/Northwind.ssdl|  
                                    res://*/Northwind.msl;  
                           provider=System.Data.SqlClient;  
                           provider connection string=  
                               &quot;Data Source=.\sqlexpress;  
                                     Initial Catalog=Northwind;  
                                     Integrated Security=True;  
                                     MultipleActiveResultSets=True&quot;"  
         providerName="System.Data.EntityClient"/>  
  </connectionStrings>  
</configuration>

EF Designer では、接続文字列名を DbContext コンストラクターに渡すことで、この接続を使用することを DbContext に示すコードも生成されます。 次に例を示します。

public class NorthwindContext : DbContext
{
    public NorthwindContext()
        : base("name=Northwind_Entities")
    {
    }
}

接続文字列は、使用するモデルの詳細情報が含まれた EF 接続文字列なので、DbContext では、(Code First を使用してコードから計算するのではなく) 既存のモデルを読み込むことを認識します。

DbContext コンストラクターのその他のオプション

DbContext クラスには、一部のより高度なシナリオを可能にする他のコンストラクターと使用パターンが含まれています。 それらのツールの一部を紹介します。

  • DbModelBuilder クラスを使用すると、DbContext インスタンスをインスタンス化せずに Code First モデルを構築できます。 この結果として DbModel オブジェクトが作成されます。 その後、DbContext インスタンスを作成する準備ができたら、この DbModel オブジェクトを DbContext コンストラクターの 1 つに渡すことができます。
  • データベースまたは接続文字列名だけでなく、完全な接続文字列を DbContext に渡すことができます。 既定で、この接続文字列は System.Data.SqlClient プロバイダーで使用されます。これは、IConnectionFactory の別の実装を context.Database.DefaultConnectionFactory に設定することによって変更できます。
  • DbContext コンストラクターに渡すことにより既存の DbConnection オブジェクトを使用できます。 接続オブジェクトが EntityConnection のインスタンスである場合は、Code First を使用してモデルを計算するのではなく、接続に指定されたモデルが使用されます。 オブジェクトが他の型 (SqlConnection など) のインスタンスである場合、コンテキストはそれを Code First モードに使用します。
  • 既存の ObjectContext を DbContext コンストラクターに渡して、既存のコンテキストをラップする DbContext を作成できます。 これは、ObjectContext を使用するが、アプリケーションの一部で DbContext を利用する既存のアプリケーションで使用できます。