MySQL 连接器/NET 开发人员指南  / 第 7 章实体框架的连接器/NET  / 7.2 实体框架核心支持  /  7.2.3 在 EF Core 中配置字符集和排序规则

7.2.3 在 EF Core 中配置字符集和排序规则

本部分介绍如何在 Entity Framework (EF) Core 模型的实体和实体属性级别更改字符集和/或排序规则。对模型所做的修改会影响从您的代码生成的表和列。

有两种不同的方法可用于在代码优先场景中配置字符集和排序规则。数据注释使你能够将属性直接应用于 EF Core 模型。或者,您可以覆盖 OnModelCreating派生 DbContext类上的方法并使用代码优先的 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;

使用流畅的 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
    });
  }
}