團隊技術棧以 EF 為主,近期項目需接入 MySQL。本文記錄 EF6 + MySQL.Data.Entity 完整接入流程,包含 NuGet 依賴、配置文件解析、連接字符串規範、上下文定義等關鍵節點。
Install-Package MySql.Data.Entity -Version 6.9.6
安裝後 App.config/Web.config 自動注入:
<entityFramework>
<providers>
<provider invariantName="MySql.Data.MySqlClient"
type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6,
Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider"
invariant="MySql.Data.MySqlClient"
description=".Net Framework Data Provider for MySQL"
type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data,
Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="MyContext"
connectionString="Server=localhost;Port=3306;Database=Test;Uid=root;Pwd=1111;CharSet=utf8;"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Server/Port:主機端口Database:初始資料庫(對應 Initial Catalog)Uid/Pwd:賬號密碼CharSet=utf8:防止中文亂碼,關鍵參數SslMode=Required、ConnectionTimeout=30[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyContext : DbContext
{
public MyContext() : base("name=MyContext") { }
public DbSet<EntityA> EntitiesA { get; set; }
public DbSet<EntityB> EntitiesB { get; set; }
// 其他 DbSet...
}
DbConfigurationType:指定 MySQL 專用配置類,自動處理 SQL 生成差異base("name=MyContext"):引用配置文件中 name="MyContext" 的連接串| 現象 | 原因 | 解決 |
|---|---|---|
| Migration 報錯「Provider not found」 | 配置文件 provider 節點缺失或版本號不匹配 | 核對 Version=6.9.6.0 與 DLL 一致 |
| 中文存入變 ??? | 連接串缺少 CharSet=utf8 或表字符集非 utf8 | 補全連接串參數,表建立時 CHARSET=utf8mb4 |
| Code First 建表無主鍵 | 實體類未標註 [Key] 或無 Id 約定屬性 | 添加 [Key] Attribute 或 Fluent API 配置 |
| 並發衝突異常 | 缺少樂觀鎖 [Timestamp] / [ConcurrencyCheck] | 為實體添加 byte[] RowVersion 屬性 |
MySqlEFConfiguration 的 CommandTimeout 調優Pomelo.EntityFrameworkCore.MySQL 評估 EF Core 遷移可行性EF6 + MySQL 整合核心在於「Provider 註冊正確、連接串字符集完整、上下文配置類指定」。完成這三點,後續業務開發即可享受 LINQ 強類型查詢與自動遷移紅利。