Entity Framework Core 中的值转换器(Value Conversion)

Posted JimCarter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Entity Framework Core 中的值转换器(Value Conversion)相关的知识,希望对你有一定的参考价值。

https://docs.microsoft.com/zh-cn/ef/core/modeling/value-conversions?tabs=data-annotations

1.简介

值转换器可以在读取或写入数据时改变属性的值。值转换器定义了两种类型:

  • ModelClrType:实体里定义的clr类型。
  • ProviderClrType:是provider理解的clr类型。

比如当把enum以字符串的形式存储到数据库时,ModelClrType就是enumProviderClrType就是string

通常使用两个Func委托来定义转换器:一个负责将ModelClrType转为ProviderClrType,另一个负责将ProviderClrType转为ModelClrType

2. 配置值转换器

在dbcontext的onModelCreating方法中可以进行配置

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Rider>()
        .Property(e => e.Mount)//Mount是个EquineBeast类型的枚举
        .HasConversion(
            v => v.ToString(),
            v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
}

注意:NULL值不会被传递到转换器上。

3. 框架内置的转换器

上述的Enumstring的转换,也可以通过HasConversion方法实现:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Rider>()
    	.Property(e => e.Mount)
    	.HasConversion<string>();
}

HasConversion方法实际上会创建一个ValueConverter<TModel,TProvider>的实例。等同如下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var converter = new ValueConverter<EquineBeast, string>(
        v => v.ToString(),
        v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));

    modelBuilder.Entity<Rider>()
    	.Property(e => e.Mount)
    	.HasConversion(converter);
}

也可以通过指定数据库列的类型,实现相同的功能

//使用特性
public class Rider2
{
    public int Id { get; set; }

    [Column(TypeName = "nvarchar(24)")]
    public EquineBeast Mount { get; set; }
}

//FluentAPI
modelBuilder.Entity<Rider2>().Property(e => e.Mount).HasColumnType("nvarchar(24)");

如上所述,EF自带了一组ValueConverter<TModel,TProvider>。通常情况下,EF会基于模型中属性的类型和数据库列的类型选择适当的转换器。

内置转换器的完整列表见:内置转换器

以上是关于Entity Framework Core 中的值转换器(Value Conversion)的主要内容,如果未能解决你的问题,请参考以下文章

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

Entity Framework Core 2.1 中的 ReverseEngineeringGenerator

Entity Framework Core 2 中的 ConnectionString 生成器

根据 ASP.NET Core 和 Entity Framework Core 中的条件禁用 [必需] 属性

在 Entity Framework Core 中为 PostgreSQL 表的计算列设置公式

Entity Framework Core 中的动态数据模型