Entity Framework 6 と MySQL の統合設定ガイド

Entity Framework 6(EF6)は、.NET Framework 向けの成熟した ORM ライブラリであり、MySQL との連携も公式にサポートされています。本稿では、MySQL データベースへの安全かつ効率的な接続を実現するための構成手順と実装パターンを、実践的な観点から解説します。

前提条件と依存パッケージ

プロジェクトに EF6 を通じて MySQL へ接続するには、以下のコンポーネントが必須です:

  • EntityFramework(バージョン 6.x)
  • MySql.Data(Oracle 公式の .NET コネクタ、v8.0+ 推奨)
  • MySql.Data.Entity(EF6 専用アダプタ、MySQL Connector/NET の一部)

Visual Studio のパッケージマネージャーコンソールで、次のようにインストールします:

Install-Package EntityFramework -Version 6.4.4
Install-Package MySql.Data -Version 8.2.0
Install-Package MySql.Data.Entity -Version 6.10.10

構成ファイルへの接続文字列定義

アプリケーション構成(App.config または Web.config)の <connectionStrings> セクションに、MySQL 向けの接続文字列を追加します。セキュリティ向上のため、SSL 有効化と文字セット明示を推奨します:

<connectionStrings>
  <add name="ProductionContext" 
       connectionString="server=127.0.0.1;port=3306;database=app_data;uid=ef_app;pwd=SecurePass123!;SslMode=Required;Charset=utf8mb4;" 
       providerName="MySql.Data.MySqlClient" />
</connectionStrings>

カスタム DbContext の実装

MySQL 固有の挙動(例:自動インクリメント戦略や時刻型の処理)に対応するため、OnModelCreating メソッドでモデル構成を微調整します:

public class AppDbContext : DbContext
{
    public AppDbContext() : base("ProductionContext") { }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<Profile> Profiles { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // MySQL 互換性のため、ID 列を INT UNSIGNED として扱う
        modelBuilder.Entity<Account>()
            .Property(x => x.Id)
            .HasColumnType("int unsigned");

        // DATETIME(6) を使用可能にする(マイクロ秒対応)
        modelBuilder.Entity<Profile>()
            .Property(x => x.LastLogin)
            .HasColumnType("datetime(6)");
    }
}

エンティティクラスの定義

データベーステーブルに対応する POCO クラスを定義します。属性によるマッピングは最小限に抑え、代わりに Fluent API を活用します:

public class Account
{
    public uint Id { get; set; }
    public string Username { get; set; } = string.Empty;
    public string HashedPassword { get; set; } = string.Empty;
}

public class Profile
{
    public uint Id { get; set; }
    public uint AccountId { get; set; }
    public string FullName { get; set; } = string.Empty;
    public DateTime LastLogin { get; set; }
}

データ操作の実行例

接続確立後、LINQ to Entities を用いた型安全なクエリが可能です。以下は、アカウント情報と関連プロフィールを結合して取得する例です:

using (var db = new AppDbContext())
{
    var activeUsers = db.Accounts
        .Include(a => a.Profile)
        .Where(a => a.Profile.LastLogin > DateTime.UtcNow.AddDays(-7))
        .Select(a => new
        {
            a.Username,
            a.Profile.FullName,
            a.Profile.LastLogin
        })
        .ToList();

    foreach (var item in activeUsers)
    {
        Console.WriteLine($"[{item.Username}] {item.FullName} — 最終ログイン: {item.LastLogin:yyyy-MM-dd HH:mm:ss}");
    }
}

注意事項とベストプラクティス

  • MySQL のデフォルト照合順序(utf8mb4_0900_ai_ci)と EF6 の制約を考慮し、必要に応じて collation を明示的に指定
  • 接続プールの最適化のため、Connection TimeoutMax Pool Size を接続文字列に含める
  • 開発環境では MySqlMigrationSqlGenerator をカスタマイズして、MySQL 固有の DDL 文生成を制御可能

タグ: entity-framework-6 mysql-connector-net mysql-8 net-framework ORM

7月31日 19:53 投稿