本部分介绍如何在 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
类表示一个实体(或表),而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 模型保持不变。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
});
}
}