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号