本节介绍如何在 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 类表示一个实体(或表),而 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;使用流畅 API 方法时,EF Core 模型保持不变。流畅 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
});
}
}