Entity Framework Core——4.值转换器(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会基于模型中属性的类型和数据库列的类型选择适当的转换器。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值