文档首页
MySQL Connector/NET 开发人员指南
相关文档 下载此手册
PDF (US Ltr) - 1.3Mb
PDF (A4) - 1.3Mb


MySQL Connector/NET 开发人员指南  /  ...  /  在 EF Core 中配置字符集和排序规则

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

本节介绍如何在 Entity Framework (EF) Core 模型中,在实体和实体属性级别更改字符集、排序规则或两者。对模型进行的修改会影响从您的代码生成的表和列。

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

使用代码优先流畅 API

添加以下指令来引用与字符集和排序规则配置相关的函数。

注意

MySQL.EntityFrameworkCore.Extensions 命名空间适用于 Connector/NET 8.0.23 及更高版本。较早的连接器版本需要 MySQL.Data.EntityFrameworkCore.Extensions 命名空间。

using MySQL.EntityFrameworkCore.Extensions;

使用流畅 API 方法时,EF Core 模型保持不变。流畅 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
    });
  }
}