本节介绍如何在 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
});
}
}