EFcore 字段的反序列化使用和序列化保存
这篇文章主要是想记录值转换,不过涉及模型中像上面的常用方式。
注:复杂的值转换如需要转成对象,或者反序列化之类的,实测在用上面这两种模型构造中,使用转换后赋值是行不通的,上面这两种都要求字段和属性的类型及名称匹配,或者参数和属性的类型和名称要匹配。
所以真正值转换还是要靠ValueConverter 类。
参考地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/value-conversions
ValueConverter类实例化时,有两个主要参数Expression<Func<TModel, TProvider>> convertToProviderExpression和Expression<Func<TProvider, TModel>> convertFromProviderExpression。
Expression<Func<TModel, TProvider>> convertToProviderExpression 这是把 实体模型属性的类型转换为数据库类型的表达式树
Expression<Func<TProvider, TModel>> convertFromProviderExpression 这个是相反的把数据库字段类型转为实体属性类型的表达式树
其一正一反,一个是写库时要把实体属性类型转为表字段类型,一个是读库时,把表字段类型回转为实体模型中属性的类型。
————————————————
public class Test
{
//通过构造函数方法进行值转换行不通
//public Test(string testName)
//{
// this.TestName = JsonHelper.ToObject<Dictionary<string, string>>(testName);
//}
public int Id { get; set; }
public List<UpgradeWayModel> TestName { get; set; }
}
public class UpgradeWayModel
{
public int Id { get; set; }
public int SourceType { get; set; } = -1;
public int UpgradeType { get; set; }
}
//DbContext
public virtual DbSet<Test> Test { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//把表中字段在存储的序列化字符串反序列化为字典
//var converter = new ValueConverter<Dictionary<string, string>, string>(
//v => JsonHelper.ToJson(v),
//v => JsonHelper.ToObject<Dictionary<string, string>>(v));
//把表中字段在存储的序列化字符串反序列化为对象
var converter = new ValueConverter<List<UpgradeWayModel>, string>(
v => JsonHelper.ToJson(v),
v => JsonHelper.ToObject<List<UpgradeWayModel>>(v));
modelBuilder
.Entity<Test>()
.Property(e => e.TestName)
.HasConversion(converter);
}
也可以对读取到的数据进行统一的加工。如下:
public class NetworkAcessLink
{
public int Id { get; set; }
public string ClassSku { get; set; }
}
//---------------------------------------------------
//DbContext
public virtual DbSet<NetworkAcessLink> NetworkAcessLink { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//对表中读取到的值进行加工
var converter = new ValueConverter<string, string>(v => v, v => string.Concat("0x", v.ToUpper()));
modelBuilder.Entity<NetworkAcessLink>()
.Property(b => b.ClassSku)
.HasConversion(converter);
}
浙公网安备 33010602011771号