EFCore 数据模型 和 值转换

2023-10-31

操作中经常要涉及到模型和值转换的问题,这里记录一下,实际使用过程中遇到过的问题,而非功能的全部。

模型

EFCore中支持字段

参考地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/backing-field?tabs=data-annotations

注意:字段和属性的类型要一致。

按照约定,将发现以下字段作为给定属性的支持字段 (按优先级顺序) 列出。

  • _<camel-cased property name>
  • _<property name>
  • m_<camel-cased property name>
  • m_<property name>
public class Blog
{
    private string _url;

    public int BlogId { get; set; }

    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }
}

构造函数

可以使用参数定义构造函数,并在创建实体实例时使 EF Core 调用此构造函数。 构造函数参数可以绑定到映射的属性或各种类型的服务,以促进延迟加载等行为。

参考地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/constructors

注意:构造函数中的参数与属性的 类型 和 名称 必须相匹配,具体如下:

  • 并非所有属性都需要具有构造函数参数。 例如,后期内容属性不是由任何构造函数参数设置的,因此 EF Core 会在以正常方式调用构造函数后对其进行设置。
  • 参数类型和名称必须与属性类型和名称相匹配,但在参数采用 camel 大小写格式时,属性可以采用 Pascal 大小写形式。
  • EF Core 无法使用构造函数在) 以上的博客或文章 (设置导航属性。
  • 构造函数可以是公共的,也可以是私有的,或者具有任何其他可访问性。 不过,延迟加载代理要求构造函数可从继承代理类访问。 通常,这意味着将其设为公共或受保护。
public class Blog
{
    public Blog(int id, string name, string author)
    {
        Id = id;
        Name = name;
        Author = author;
    }

    public int Id { get; set; }

    public string Name { get; set; }
    public string Author { get; set; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    public Post(int id, string title, DateTime postedOn)
    {
        Id = id;
        Title = title;
        PostedOn = postedOn;
    }

    public int Id { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PostedOn { get; set; }

    public Blog Blog { get; set; }
}

 

 

值转换

这篇文章主要是想记录值转换,不过涉及模型中像上面的常用方式。

注:复杂的值转换如需要转成对象,或者反序列化之类的,实测在用上面这两种模型构造中,使用转换后赋值是行不通的,上面这两种都要求字段和属性的类型及名称匹配,或者参数和属性的类型和名称要匹配。

 

所以真正值转换还是要靠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);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EFCore 数据模型 和 值转换 的相关文章

随机推荐

  • 准备全面进行了

    根据这两个月的试用期 带我的那哥们告诉我应该转正没问题 另外 转了UE4后 发现找的猎头和HR很多 看来 也要好好重视了 不能只把UE4当UI使用了 当然 由于刚转 猎头和HR提供的薪水基本上都是20k起步 极个别过30k的 不如现在25K
  • JVM--基础--26.3--工具--jinfo

    JVM 基础 26 3 工具 jinfo 1 介绍 查看运行中jvm的全部参数 还可以设置部分参数 2 语法 2 1 格式 jinfo option pid jinfo option executable core jinfo option
  • CountDownLatch 简单介绍

    CountDownLatch 是多线程控制的一种工具 它被称为 门阀 计数器或者 闭锁 这个工具经常用来用来协调多个线程之间的同步 或者说起到线程之间的通信 而不是用作互斥的作用 下面我们就来一起认识一下 CountDownLatch 认识
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接 则槽函数会触发多次 默认 可能不是我们想要的结果 有3种方法可以解决这个问题 1 仅在初始化函数中进行连接 因为初始化函数在在整个程序中只运行一次 所以这里面连接信号和槽 就能避免重复连接问题了 2 连接函数写上
  • 投屏为什么显示无法连接服务器,乐播投屏为什么连不上? 乐播投屏无法连接如何解决?...

    随着乐播投屏吸引的新用户逐渐增多 有些朋友发现自己的手机与电视无法成功连接到一起 更别说进行投屏了 而下面小编就为大家介绍了乐播投屏无法连接电视的原因 希望对你有所帮助 乐播投屏无法连接的处理教程 面对无法连接电视的情况 我们需要先保证自己
  • shell编程100例

    1 编写hello world脚本 bin bash 编写hello world脚本 echo Hello World 2 通过位置变量创建 Linux 系统账户及密码 bin bash 通过位置变量创建 Linux 系统账户及密码 1 是
  • 一分钟学会对合并单元格填充数据(Excel)

    问题描述 大家有没有发现 我们在使用Excel时有很多情况下需要对某列几行的内容进行合并 但是其他列中需要填写的内容却又完全相同 本文用两种方法解决这一问题 重点是方法二哦 一分钟可搞定数百条数据 如下图 需要按照专业进行单元格合并 但是他
  • vue高德地图初体验地图初始化(一)

    vue高德地图初体验地图初始化 安装依赖 引用依赖 地图初始化 AMap Map参数说明 安装依赖 npm i amap amap jsapi loader save 引用依赖 import AMapLoader from amap ama
  • A level数学真题解析及运用

    在A level考试9709数学科目中pure mathematics 3考卷考察范围内有一章节名为complex number 即复数章节 这部分知识点虽然理解难度不大 但是在我国普通高中的数学学习中涉及的较少 考生在接受上有比较大的难度
  • java设计模式-单例模式

    Java中单例 Singleton 模式是一种广泛使用的设计模式 单例模式的主要作用是保证在Java程序中 某个类只有一个实例存在 一些管理器和控制器常被设计成单例模式 单例模式有很多好处 它能够避免实例对象的重复创建 不仅可以减少每次创建
  • C++ operator == 的一些思考

    最近写代码的时候 需要重载 以前也没有进行过太多的思考 都是顺手就写了 在这里就总结一下 下面的代码是 应该是重载 用的最多的写法了 class Demo public Demo int a a a Demo bool operator c
  • java poi读取pdf word excel文档,读取pdf文字图片

    文章目录 依赖 读取pdf文本和图片 简单读取word docx doc文字 读取word doc表格内容 读取word doc图片 读取excel 输出到excel office转pdf 依赖
  • springCloud Eureka 报错解决方案

    在根据大神的文章安装eureka过程遇到些报错 这里记录下比较好的解决方案 史上最简单的 SpringCloud 教程 终章 方志朋的博客 CSDN博客 springcloud 启动Eureka server 直接启动报错 EMERGENC
  • html5图片并列排版,小编,图片与文字并排怎么排版呢?

    图文排版 H5秀 手机图文 小伙伴 小米 我想左边放图片 右边是文字 但是图片插入之后 再编辑文字只能在下一行 我就直接调整段前距 但有时候预览它会错位 想问图片与文字并排如何排版出来呢 这是一个日经题 设置段前距或许是一个方法 但设定的数
  • Windows下PyTorch1.5的下载安装

    在安装PyTorch之前要先安装好CUDA cudNN 以及anaconda 还有就是编译器pycharm 然后你才能开始安装PyTorch 目录 1 创建虚拟环境 2 去PyTorch官网 3 发现警告 4 解决办法 5 pip list
  • 解析波士顿动力Handle机器人背后的技术(附PPT+视频)

    转 http www leiphone com news 201703 URrR8CG2tmtghNDl html 导语 Boston Dynamics 在机器人动力方面堪称翘楚 其由双足或多足机器人组成的机器人天团总是时不时能给我们带来惊
  • Python3 pip

    Python3 pip pip 是 Python 包管理工具 该工具提供了对 Python 包的查找 下载 安装 卸载的功能 软件包也可以在 https pypi org 中找到 目前最新的 Python 版本已经预装了 pip 注意 Py
  • Nginx添加SSL模块

    目录 一 SSL 概述 SSL证书 HTTPS SSL工作原理 二 创建SSL证书 安装openssl 生成证书 三 nginx配置 nginx打补丁添加模块 nginx conf配置 四 访问 一 SSL 概述 SSL Security
  • 向日葵权限mac

    问题 权限打开后自动关上 解决 mac上几乎所有远程软件都会出现这种权限设置问题 换了腾讯会议或其他也没用 方法一 试试先打开系统的安全性设置 将向日葵软件从隐私框里移出来 点击 号移除 再重新添加进去 方法二 将权限的勾选去掉 再添加 然
  • EFCore 数据模型 和 值转换

    操作中经常要涉及到模型和值转换的问题 这里记录一下 实际使用过程中遇到过的问题 而非功能的全部 模型 EFCore中支持字段 参考地址 https docs microsoft com zh cn ef core modeling back