值转换器允许在读取或写入数据库时转换属性值。
- ModelClrType ( 实体类型中的属性的 .NET 类型, 例如枚举类型 ) 和 ProviderClrType ( 数据库提供程序理解的 .NET 类型, 例如 string ) , 2个相互转换的 Func。
- 内置的值比较器
- 自定义的值转换类 ( 继承 ValueConverter 或者 创建 ValueConverter 的实例 )
值比较器
- 为什么需要使用值比较器
- EFCore 需要比较属性值, 而默认的 EFCore 比较引用而不是深层比较
- 或者,使用了属性类型为非结构类型的值转换器时, 此时一般需要自定义比较器, 因为如果修改转换后的对象中的属性时, EFCore 不会认为对象发生了改变, 因为 EFCore 比较引用;
- 覆盖 Equals 方法 和 GetHashCode 方法
不建议将枚举转换为字符串
使用值转换可能会影响 EF Core 将表达式转换为 SQL的能力
看上去很美,用起来悲催, 例如,枚举转换为字符串,数据库内存放的是字符串,
但如果,EF LINQ中传入了数字参数,则查询可能会出错.
var converter = new EnumToStringConverter<EquineBeast>();
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(converter);
或者
对于内置转换器存在的常见转换,无需显式指定转换器。
只需配置应使用的提供程序类型,EF 会自动使用适当的内置转换器。
modelBuilder .Entity<Rider>() .Property(e => e.Mount) .HasConversion(converter);
内置转换器
- BoolToZeroOneConverter-布尔值到零和一个
- BoolToStringConverter-布尔值到字符串(如 "Y" 和 "N")
- BoolToTwoValuesConverter-布尔值为任意两个值
- BytesToStringConverter 字节数组到 Base64 编码的字符串
- CastingConverter-只需要类型强制转换的转换
- CharToStringConverter-Char 到单字符字符串
- DateTimeOffsetToBinaryConverter-DateTimeOffset 到二进制编码的64位值
- DateTimeOffsetToBytesConverter-DateTimeOffset 到字节数组
- DateTimeOffsetToStringConverter-DateTimeOffset 到字符串
- DateTimeToBinaryConverter-DateTime 到64位值(包括 Datetimekind.utc)
- DateTimeToStringConverter-DateTime 到 string
- DateTimeToTicksConverter-DateTime 到计时周期
- EnumToNumberConverter-枚举到基础数字
- EnumToStringConverter 枚举到字符串
- GuidToBytesConverter-Guid 到字节数组
- GuidToStringConverter-Guid 到字符串
- NumberToBytesConverter-任何数值到字节数组
- NumberToStringConverter-字符串的任何数值
- StringToBytesConverter 字符串到 UTF8 字节
- TimeSpanToStringConverter-TimeSpan 到字符串
- TimeSpanToTicksConverter-TimeSpan 到计时周期