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
就是enum
,ProviderClrType
就是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. 框架内置的转换器
上述的Enum
到string
的转换,也可以通过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 中的条件禁用 [必需] 属性