【Entity Framework】你要知道EF中功能序列与值转换
文章目录

一、序列
序列在数据库中生成唯一的顺序数值。 序列不与特定表关联,可以设置多个表以从同一序列提取值。
1.1 基本用法
可以在模型中设置序列,然后使用它为属性生成值:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasSequence<int>("OrderNumbers");
modelBuilder.Entity<Order>()
.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR OrderNumbers");
}
请注意,从序列生成值的特定SQL是特定于数据库的;上面的示例适用于 SQL Server 但在其他数据库上将失败。 有关详细信息,请查阅数据库的文档。
1.2 配置序列设置
还可以配置序列的其他方面,例如其架构、起始值、增量等:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000)
.IncrementsBy(5);
}
二、值转换
值转换器可在从数据库读取或向其中写入属性值时转换属性值。此转换可以是从同一类型的一个值转换为另一个值(如:加密字符串),也可以是从一种类型的值转换为另一种类型的值(如:数据库中枚举值和字符串的相互转换)。
值转换器的指定涉及 ModelClrType
和 ProviderClrType
。 模型类型是实体类型中的属性的 .NET 类型。 提供程序类型是数据库提供程序理解的 .NET 类型。 例如,若要在数据库中将枚举保存为字符串,模型类型是枚举的类型,而提供程序类型是 String
。 这两种类型可以相同。
使用两个 Func
表达式树定义转换:一个从 ModelClrType
转换为 ProviderClrType
,另一个从 ProviderClrType
转换为 ModelClrType
。 使用表达式树的目的是使它们可被编译到数据库访问委托中,以便进行高效转换。 表达式树可能包含对复杂转换的转换方法的简单调用。
2.1 配置值转换器
值转换在DbContext.OnModelCreating中配置
。如,将一个枚举和实体类型定义为:
public class Rider
{
public int Id { get; set; }
public EquineBeast Mount { get; set; }
}
public enum EquineBeast
{
Donkey,
Mule,
Horse,
Unicorn
}
可在OnModelCreating
中转换进行如下配置:在数据库中将枚举值存储为字符串。可以通过执行从ModelClrType
到ProviderClrType
的转换,另一个执行反向的转换:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(
v => v.ToString(),
v =>