值转换器
基础知识
值转换器允许向数据库读取或写入数据时,在 模型和数据库之间转换数据。
例如:模型字段
类型是枚举,保存数据库中的类型为字符串或者INT类型,更新或者插入数据时,需要将枚举
转换成数据库类型,查询数据时,需要将数据库类型转换为模型的字段类型。
- 配置值转换器
public class Rider
{
public int Id { get; set; }
public EquineBeast Mount { get; set; }
}
public enum EquineBeast
{
Donkey,
Mule,
Horse,
Unicorn
}
//转换方式1
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(v =>
v.ToString(),
v => (EquineBeast)Enum.Parse(typeof(EquineBeast),
v));
//转换方式2,ValueConverter 值转换器类
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);
-
微软 EF Core 中内置的转换器
○ BoolToZeroOneConverter - Bool to zero and one
○ BoolToStringConverter - Bool to strings such as “Y” and “N”
○ BoolToTwoValuesConverter - Bool to any two values
○ BytesToStringConverter - Byte array to Base64-encoded string
○ CastingConverter - Conversions that require only a type cast
○ CharToStringConverter - Char to single character string
DateTimeOffsetToBinaryConverter - DateTimeOffset to binary-encoded 64-bit
value
○○ DateTimeOffsetToBytesConverter - DateTimeOffset to byte array
○ DateTimeOffsetToStringConverter - DateTimeOffset to string
○ DateTimeToBinaryConverter - DateTime to 64-bit value including DateTimeKind
○ DateTimeToStringConverter - DateTime to string
○ DateTimeToTicksConverter - DateTime to ticks
○ EnumToNumberConverter - Enum to underlying number
○ EnumToStringConverter - Enum to string
○ GuidToBytesConverter - Guid to byte array
○ GuidToStringConverter - Guid to string
○ NumberToBytesConverter - Any numerical value to byte array
○ NumberToStringConverter - Any numerical value to string
○ StringToBytesConverter - String to UTF8 bytes
○ TimeSpanToStringConverter - TimeSpan to string
○ TimeSpanToTicksConverter - TimeSpan to ticks -
ex
var converter = new EnumToStringConverter<EquineBeast>(); modelBuilder .Entity<Rider>() .Property(e => e.Mount) .HasConversion(converter);
-
预定义的转换
modelBuilder.Entity<Rider>().Property(e => e.Mount).HasConversion<string>();
- 也可通过数据注解的方式指定类型。
public class Rider
{
public int Id { get; set; }
[Column(TypeName = "nvarchar(24)")]
public EquineBeast Mount { get; set; }
}
通过接口实现,可定制自己的转换器。