本節說明如何在 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
類別代表實體 (或表格),而 Key1
、Key2
和 CollationColumn
代表實體屬性 (或欄位)。
[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; }
}
新增以下指示詞,以參考與字元集和校對設定相關的方法。
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; }
}
在此範例中,會重新設定實體和各種實體屬性,包括字元集和校對的傳統對應。此方法使用 ForMySQLHasCharset
和 ForMySQLHasCollation
方法。
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
});
}
}