文件首頁
MySQL Connector/NET 開發人員指南
相關文件 下載本手冊
PDF (US Ltr) - 1.3Mb
PDF (A4) - 1.3Mb


7.2.3 在 EF Core 中設定字元集和校對

本節說明如何在 Entity Framework (EF) Core 模型中的實體和實體屬性層級變更字元集、校對或兩者。對模型所做的修改會影響從您的程式碼產生的表格和欄位。

有兩種不同的方法可用於在程式碼優先情境中設定字元集和校對。資料註釋可讓您直接將屬性套用至您的 EF Core 模型。或者,您可以覆寫衍生 DbContext 類別上的 OnModelCreating 方法,並使用程式碼優先 Fluent API 來設定模型的特定特性。以下是每個方法的範例。

如需有關支援的字元集和校對的詳細資訊,請參閱MySQL 中的字元集和校對

使用資料註釋

在您可以使用字元集和校對屬性來註釋 EF Core 模型之前,請在包含您的實體模型之檔案中新增對以下命名空間的參考。

注意

MySQL.EntityFrameworkCore.DataAnnotations 命名空間適用於 Connector/NET 8.0.23 和更新版本。較早的連接器版本需要 MySQL.Data.EntityFrameworkCore.DataAnnotations 命名空間。

using MySql.EntityFrameworkCore.DataAnnotations;

新增一個或多個 [MySqlCharset] 屬性,以使用各種字元集儲存資料,以及新增一個或多個 [MySqlCollation] 屬性,以根據各種校對執行比較。在以下範例中,ComplexKey 類別代表實體 (或表格),而 Key1Key2CollationColumn 代表實體屬性 (或欄位)。

[MySqlCharset("utf8")]
public class ComplexKey
{
  [MySqlCharset("latin1")
  public string Key1 { get; set; }

  [MySqlCharset("latin1")]
  public string Key2 { get; set; }

  [MySqlCollation("latin1_spanish_ci")]
  public string CollationColumn { get; set; }
}

使用程式碼優先 Fluent API

新增以下指示詞,以參考與字元集和校對設定相關的方法。

注意

MySQL.EntityFrameworkCore.Extensions 命名空間適用於 Connector/NET 8.0.23 和更新版本。較早的連接器版本需要 MySQL.Data.EntityFrameworkCore.Extensions 命名空間。

using MySQL.EntityFrameworkCore.Extensions;

使用 Fluent API 方法時,EF Core 模型會保持不變。Fluent API 會覆寫任何屬性設定的規則。

public class ComplexKey
{
  public string Key1 { get; set; }

  public string Key2 { get; set; }

  public string CollationColumn { get; set; }
}

在此範例中,會重新設定實體和各種實體屬性,包括字元集和校對的傳統對應。此方法使用 ForMySQLHasCharsetForMySQLHasCollation 方法。

public class MyContext : DbContext
{
  public DbSet<ComplexKey> ComplexKeys { get; set; }

  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
    modelBuilder.Entity<ComplexKey>(e =>
    {
      e.HasKey(p => new { p.Key1, p.Key2 });
      e.ForMySQLHasCollation("ascii_bin"); // defining collation at Entity level
      e.Property(p => p.Key1).ForMySQLHasCharset("latin1"); // defining charset in a property
      e.Property(p => p.CollationColumnFA).ForMySQLHasCollation("utf8_bin"); // defining collation in a property
    });
  }
}