首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Entity Framework 6 整合 MySQL 實戰:NuGet 包、實體映射、DbContext 配置與常見坑點

     編輯:MySQL 資料庫相關知識

環境與版本鎖定

  • .NET Framework 4.6.1+ / .NET Core 3.1+
  • EF 6.4.4 (EF6) / EF Core 8.0
  • MySQL.Data 8.0.33+ / MySql.Data.EntityFrameworkCore 8.0.33+
  • MySQL Server 5.7+ / 8.0+

NuGet 安裝命令

# EF6 經典模式
Install-Package EntityFramework -Version 6.4.4
Install-Package MySql.Data.EntityFramework -Version 8.0.33

# EF Core 現代模式
Install-Package Microsoft.EntityFrameworkCore -Version 8.0.0
Install-Package MySql.EntityFrameworkCore -Version 8.0.33

實體類定義:字符串長度強制約束(避免 Specified key was too long)

public class User
{
    public int Id { get; set; }
    
    [StringLength(30)]           // 必須指定長度!對應 VARCHAR(30)
    public string UserName { get; set; }
    
    [MaxLength(30)]              // 或用 MaxLength
    public string PassWord { get; set; }
    
    [Column(TypeName = "VARCHAR(100)")]  // 显式指定類型
    public string Email { get; set; }
}

原因:EF 默認 string → LONGTEXT,MySQL 索引限制 767 字節 (utf8mb4 下 191 字符),超長報錯。

DbContext 配置

EF6 模式

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyContext : DbContext
{
    public MyContext() : base("name=MyContext") { }
    
    public DbSet Users { get; set; }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // 可在此處統一配置字符串默認長度
        modelBuilder.Properties()
            .Configure(p => p.HasMaxLength(255));
    }
}

EF Core 模式

public class MyContext : DbContext
{
    public DbSet Users { get; set; }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySQL("Server=localhost;Port=3306;Database=MySQL_EF;Uid=root;Pwd=root;Charset=utf8mb4;");
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity(e =>
        {
            e.Property(p => p.UserName).HasMaxLength(30).IsRequired();
            e.Property(p => p.Email).HasColumnType("VARCHAR(100)");
        });
    }
}

Web.config / appsettings.json 連接字符串

EF6 (Web.config)


  



  
  
    
  



  
    
    
  

EF Core (appsettings.json)

{
  "ConnectionStrings": {
    "Default": "Server=localhost;Port=3306;Database=MySQL_EF;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=Preferred;"
  }
}

常見坑點與解決方案

錯誤現象原因解決
Specified key was too long; max key length is 767 bytesstring 無長度限制 → LONGTEXT → 索引超限實體屬性加 [StringLength(n)] / HasMaxLength(n)
Model compatibility cannot be checked because the database does not contain model metadata數據庫已存在但無 __MigrationHistory / 模型不匹配刪除庫重建 / Enable-Migrations + Add-Migration Initial
序列不包含任何匹配元素外鍵/導航屬性配置錯誤 (如 WithMany/WithOptional 混淆)檢查 Fluent API:HasMany/WithOne, HasOne/WithMany 配對正確
Unknown column 'Extent1.Id' in 'field list'實體主鍵未標識 [Key] 或命名不符約定加 [Key] / modelBuilder.Entity().HasKey(e => e.Id)
SSL connection error / Authentication plugin errorMySQL 8.0 默認 caching_sha2_password連接串加 SslMode=Preferred; 或創建用戶指定 mysql_native_password
Charset=utf8mb4 不生效庫/表創建時字符集不一致創建庫指定 CHARSET=utf8mb4; EF 遷移腳本中指定

代碼優先遷移流程 (EF6)

# 1. 啟用遷移
Enable-Migrations -ContextTypeName MyContext

# 2. 添加初始遷移
Add-Migration InitialCreate

# 3. 更新數據庫
Update-Database -Verbose

最佳實踐總結

  1. 字符串必加長度:[StringLength] / HasMaxLength,源頭阻斷 767 字節錯誤
  2. 顯式指定類型:[Column(TypeName="VARCHAR(100)")] 避免推斷偏差
  3. 統一字符集 utf8mb4:連接串、創建庫、遷移腳本三處一致
  4. 遷移腳本納入版控:團隊協作、審計追蹤、回滾依據
  5. 連接池優化:連接串加 Pooling=true;MinPoolSize=5;MaxPoolSize=100;

EF + MySQL 核心衝突點在於 **類型映射預設值差異**。掌握「字符串強長度、字符集統一、遷移管理」三板斧,即可平穩落地。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved