.NET Framework を使用したアプリケーション開発において、データベース接続は欠かせない要素です。特に、Entity Framework 6(EF6)を使用する場合、接続文字列の管理方法はアプリの構成において非常に重要です。特に注意すべきなのは、EF6とEF Coreでは接続の仕組みが大きく異なる点です。
この記事では、web.config ファイルに定義した接続文字列を EF6 の DbContext から安全かつ効率的に利用する方法について、実践的なコード例を交えながら丁寧に解説します。さらに、Entity Framework Core(EF Core)との違いにも触れながら、注意点をまとめます。
なぜ接続文字列をweb.configに記述するのか?
まず、接続文字列(Connection String)とは、アプリケーションがデータベースにアクセスするために必要な情報をまとめた文字列です。たとえば、SQL Server のサーバー名、データベース名、認証情報などが含まれます。
この接続文字列を直接コード内に書いてしまうと、以下のような問題が発生します。
- セキュリティリスク:ソースコードにパスワードなどの情報がハードコーディングされる
- メンテナンス性の低下:接続情報が変更された場合、コードを修正して再ビルドが必要になる
- 環境ごとの切り替えが困難:開発、テスト、本番環境などで異なる接続先を管理しにくい
このような課題を解決するため、接続情報は構成ファイル(web.config または app.config)に切り出すのが一般的なベストプラクティスです。
web.config に接続文字列を定義する方法
以下は、典型的な SQL Server に接続するための web.config の記述例です。
<configuration>
<connectionStrings>
<add name="MyDbContext"
connectionString="Data Source=.;Initial Catalog=MyDatabase;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>ここで指定されている属性は以下の通りです。
- name: この接続文字列の識別子であり、
DbContext側から参照される名前です。 - connectionString: 実際の接続文字列。SQL Server のインスタンスやデータベース名、認証方式などを含みます。
- providerName: データプロバイダを指定します。SQL Server の場合は
"System.Data.SqlClient"が必要です。
DbContext で接続文字列を利用する方法
Entity Framework 6 の DbContext クラスを使ってデータベースとやり取りする際、web.config の接続文字列を読み込む方法はいくつかあります。ここでは代表的な2つの方法を紹介します。
方法1: コンストラクタで接続文字列の「名前」を指定する
最も一般的でシンプルな方法です。以下のように DbContext のコンストラクタで name=MyDbContext の形式で指定します。
public class MyDbContext : DbContext
{
public MyDbContext() : base("name=MyDbContext")
{
}
public DbSet<MyEntity> MyEntities { get; set; }
}ここで注意すべきなのは、“name=” を接頭辞としてつけることです。これをつけないと、EF は文字列を「接続文字列そのもの」として解釈してしまい、web.config から読み取ってくれません。
方法2: ConfigurationManager から明示的に取得する
より柔軟に接続情報を制御したい場合は、System.Configuration.ConfigurationManager を使って接続文字列をプログラムから直接取得することもできます。
using System.Configuration;
public class MyDbContext : DbContext
{
public MyDbContext() : base(GetConnectionString())
{
}
private static string GetConnectionString()
{
return ConfigurationManager.ConnectionStrings["MyDbContext"].ConnectionString;
}
public DbSet<MyEntity> MyEntities { get; set; }
}この方法では、接続文字列の取得ロジックを別メソッドに切り出しており、状況に応じて処理を追加したり環境に応じた分岐を設けたりできます。
よくある落とし穴と対処法
1. "name=" をつけ忘れる
// NG例:これだと web.config から読み込まれない
public MyDbContext() : base("MyDbContext") { }正しくは "name=MyDbContext" と指定する必要があります。
2. providerName の指定忘れ
web.config の <add> 要素に providerName="System.Data.SqlClient" を記述し忘れると、EF がどのデータプロバイダを使えばよいか分からず、実行時エラーになることがあります。
3. 名前のスペルミス
web.config の name="MyDbContext" と、DbContext 側の "name=MyDbContext" の綴りが一致していないと、接続エラーになります。コピペで一致させるようにしましょう。
EF Core と EF6 の違いに関する注意事項
Entity Framework Core(EF Core)では、接続文字列の管理と注入の方法が大きく異なります。以下に主要な違いをまとめます。
1. 設定ファイルの違い
- EF6:
web.configまたはapp.configに接続文字列を記述します。 - EF Core:
appsettings.jsonに記述し、IConfigurationを通じて読み取ります。
// EF Core の appsettings.json の例
{
"ConnectionStrings": {
"MyDbContext": "Server=localhost;Database=MyDb;Trusted_Connection=True;"
}
}2. DI(依存性注入)による接続管理
- EF6:
DbContextのコンストラクタで直接文字列を渡します。 - EF Core:
Program.csやStartup.csでservices.AddDbContext()を使い、IServiceCollectionに登録します。
builder.Services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MyDbContext")));3. 環境ごとの構成の切り替え
- EF6:
web.configの構成変換(web.Release.configなど)を使用 - EF Core:
appsettings.Development.jsonやappsettings.Production.jsonによるマルチ環境対応
4. マイグレーションの動作が異なる
- EF6:Migration は
web.configから接続文字列を読み取る - EF Core:Migration は DI 経由で
DbContextOptionsを使用
接続先の切り替えを簡単にするTips
開発、ステージング、本番など、環境によって接続先が異なる場合は、web.config の構成変換(Transform)を活用することで、自動的に適切な接続先に切り替えることが可能です。
例:web.Release.config
<connectionStrings>
<add name="MyDbContext"
connectionString="Data Source=production-server;Initial Catalog=ProdDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</connectionStrings>Visual Studio で「リリース」ビルド時に、この設定が適用されます。
おわりに
Entity Framework 6 において、web.config から安全かつ柔軟に接続文字列を取得する方法を理解しておくことは、アプリケーション開発において非常に重要です。
特に注意すべきなのは、EF6とEF Coreでは接続の仕組みが大きく異なる点です。EF6では構成ファイルによる管理が中心ですが、EF Coreではコードベースの構成と依存性注入が主流です。これらの違いを理解しておくことで、将来的な移行やメンテナンスの際にも混乱を避けることができます。
この記事を参考に、安全で保守性の高いデータベース接続の設計を実現してみてください。
