当前位置: 首页 > article >正文

EF Core中实现值对象

目录

值对象优点

值对象的需求

值类型的实现

值类型GEO的实现

值类型MultilingualString的实现

案例:构建表达式树,简化值对象的比较


值对象优点

  1. 把有紧密关系的属性打包为一个类型
  2. 把领域知识放到类的定义中
class shangjia
{long id;string name;Geo location;
}class Geo
{double jingdu;double weidu;
}

值对象的需求

  1. “商品”实体中的重量属性。我们如果把重量定义为double类型,那么其实是隐含了一个“重量单位”的领域知识,使用这个实体类的开发人员就需要知道这个领域知识,而且我们还要通过文档等形式把这个领域知识记录下来,这又面临一个文档和代码修改同步的问题。
  2. 实现:定义一个包含Value(数值)、Unit(单位)的Weight类型,然后把“商品”的重量属性设置为Weight类型。
    class Shangpin
    {long id;string name;Weight weight;
    }class Weight
    {long Value;WeightUnit Unit;
    }
    enum WeightUnit{G,KG}
  3. 很多数值类型的属性其实都是隐含了单位的,比如金额隐含了币种信息。

值类型的实现

“从属实体类型(owned entities)”:使用Fluent API中的OwnsOne等方法来配置。

在EF Core中,实体的属性可以定义为枚举类型,枚举类型的属性在数据库中默认是以整数类型来保存的。对于直接操作数据库的人员来讲,0、1、2这样的值没有“CNY”(人民币)、“USD”(美元)、“NZD”(新西兰元)等这样的字符串类型值可读性更强。EF Core中可以在Fluent API中用HasConversion<string>()把枚举类型的值配置成保存为字符串。


public class Entity1
{public int Id{ get; set; }public string Name{ get; set; }public CurrencyName Currency{ get; set; }
}enum CurrencyName
{CNY,USD,NZD
}builder..Property(e=>e.Currency).HasConversion<string>().HasMaxLenght(10);

值类型GEO的实现

record Geo{public double Longitude { get; init; }public double Latitude { get; init; }public Geo(double longitude, double latitude){if(longitude<-180||longitude>180)throw new ArgumentException("longitude invalid");if (latitude < -90 || latitude > 90)throw new ArgumentException("longitude invalid");this.Longitude = longitude;this.Latitude = latitude;}
}builder.OwnsOne(c=>c.Location);

值类型MultilingualString的实现

record MultiLangString(string Chinese, string? English);public class Blog
{public int Id { get; set;}public MultiLangString Title { get; set; }public MultiLangString Body { get; set; }
}//builder.OwnsOne(e=>e.Title);
//builder.OwnsOne(e=>e.Body);builder.OwnsOne(c=>c.Title, x => {x.Property(e=>e.Chinese).HasMaxLength(255);x.Property(e=>e.English).HasColumnType("varchar(255)");});
builder.OwnsOne(c=>c.Body, x => {x.Property(e=>e.Chinese);x.Property(e=>e.English).HasColumnType("varchar(Max)");
});

案例:构建表达式树,简化值对象的比较

目前版本,如果需要进行数据筛选,值对象的属性不能直接进行相等比较,只能把值对象的各个属性逐个进行比较,如果属性较多或需要相等比较的代码较多的话,操作会比较麻烦,可以构建表达式树来生成一个进行相等比较的表达式,从而简化EF Core中值对象的比较。

错误写法
var x = db.blogs.First(b => b.Title == new MultiLangString("你好", "hello"));
var a = db.blogs.First(b => b.Title.Equals(new MultiLangString("你好", "hello")));正确写法
var a = db.blogs.First(b => b.Title.Chinese=="你好"&&b.Title.English=="hello");

NETBookMaterials/最后大项目代码/YouZack-VNext/Zack.Infrastructure/EFCore/ExpressionHelper.cs at main · yangzhongke/NETBookMaterials

Nuget:Zack.Infrastructure

var a = db.blogs.First(ExpressionHelper.MakeEqual((Blog b) => b.Title,(new MultiLangString("你好", "hello"))));

相关文章:

EF Core中实现值对象

目录 值对象优点 值对象的需求 值类型的实现 值类型GEO的实现 值类型MultilingualString的实现 案例&#xff1a;构建表达式树&#xff0c;简化值对象的比较 值对象优点 把有紧密关系的属性打包为一个类型把领域知识放到类的定义中 class shangjia {long id;string nam…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题

前言 在这篇博客中&#xff0c;我们将通过模拟的方法来解决三道经典的算法题&#xff1a;回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力&#xff0c;还挑战了我们对日期处理和数学推理的理解。通过模拟算法&#xff0c;我们能够深入探索每个问题的核心…...

Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案

1. 如何在 Kubernetes 中设置资源请求和限制&#xff1f; 资源请求确保容器有最小资源量&#xff08;CPU/内存&#xff09;&#xff0c;而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例&#xff1a; resources:requests:memory: "256Mi&…...

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中&#xff0c;Docker Compose是一种非常实用的工具&#xff0c;它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而&#xff0c;除了Docker之外&#xff0c;Podman也提供了类似的工具——Podman Compose&#xff0c;它允许我们在…...

科普:数据仓库中的“指标”和“维度”

在数据仓库中&#xff0c;指标和维度是两个核心概念&#xff0c;它们对于数据分析和业务决策至关重要。以下是对这两个概念的分析及举例说明&#xff1a; 一、指标 定义&#xff1a; 指标是用于衡量业务绩效的关键数据点&#xff0c;通常用于监控、分析和优化企业的运营状况。…...

11.swagger使用

菜单位置 未登录接口会返回401 登录的token存储的位置 配置文件swagger配置中将/dev-api修改/...

java高级知识之集合

前言 集合是java开发中的重点内容&#xff0c;需要掌握的东西很多&#xff0c;面试中可问的东西很多&#xff0c;无论是深度还是广度。集合框架中Collection对应的实现类如下所示&#xff0c;这些都是要完全掌握&#xff0c;一个可以分为三大类List集合、Set‘集合以及Map集合…...

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi&#xff1a;https://kimi.moonshot.cn/...

hadoop之MapReduce:片和块

假如我现在500M这样的数据&#xff0c;如何存储&#xff1f; 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候&#xff0c;是按照片儿计算的&#xff0c;而不是块儿。 块是物理概念&#xff0c;一个块就是128M ,妥妥的&#xff0c;毋庸置疑。 片是逻辑概念&…...

好好说话:深度学习扫盲

大创项目是和目标检测算法YOLO相关的&#xff0c;浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么&#xff1f; 之前经常听到AI&#xff0c;机器学习&#xff0c;深度学习这三个概念&#xff0c;但是对于三者的区别一直很模糊。 AI&…...

ASP.NET Core的贫血模型与充血模型

目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型&#xff1a;一个类中只有属性或者成员变量&#xff0c;没有方法。充血模型&#xff1a;一个类中既有属性、成员变量&#xff0c;也有方法。 需求 定义一个类保存用户的用户名、密码、积分&#xff1b;用户必须具有…...

【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;kubectl 和 …...

2100年芜湖人的一天:张明的生活剪影

2100年芜湖人的一天&#xff1a;张明的生活剪影 破晓 6:30 "沙沙"的微风声轻轻掠过耳畔&#xff0c;杨柳的沙沙声混合着若有若无的鸟鸣&#xff0c;张明的意识从深邃的梦境中缓缓浮现。这并非真实的自然声响&#xff0c;而是他的脑机接口精心编织的唤醒交响曲。量子…...

外贸网站源码 助力企业抢占蛇年市场先机!

在竞争激烈的外贸市场中&#xff0c;蛇年无疑是企业寻求突破与增长的关键一年。外贸网站源码为企业提供了快速搭建专业外贸网站的解决方案&#xff0c;助力企业在新的一年抢占市场先机。 快速上线 时间就是商机&#xff0c;尤其是在蛇年这样充满变数和机遇的年份。外贸网站源码…...

verilog练习:i2c slave 模块设计

文章目录 前言1.结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…...

项目6:基于大数据校园一卡通数据分析和可视化

1、项目简介 本项目是基于大数据的清华校园卡数据分析系统&#xff0c;通过Hadoop&#xff0c;spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析&#xff0c;并通过Web后端和可视化前端展示结果。项目运行便捷&…...

Linux常见系统日志类型

目录 系统日志&#xff08;/var/log/syslog 或 /var/log/messages&#xff09; 认证日志&#xff08;/var/log/auth.log 或 /var/log/secure&#xff09; Web服务器日志&#xff08;/var/log/apache2/ 或 /var/log/nginx/&#xff09; MySQL日志&#xff08;/var/log/mysql/…...

npm 常用命令大全

npm 常用命令大全 下载包 npm install清理缓存 npm cache clean --force查看当前配置 npm config get registry设置淘宝镜像 npm config set registry https://registry.npmmirror.com查看 npm 版本 npm -vnpm 设置超时时间 npm config set fetch-timeout 600更新依赖 …...

java.io.InvalidClassException

类实现序列问题 如果实现了序列&#xff0c;最好生成序列号&#xff0c;因为类结构发生改变时&#xff0c;会报错 java.io.InvalidClassException 所以实现序列&#xff0c;需要生成序列号 private static final long serialVersionUID 1L;...

Datawhale 组队学习 Ollama教程 task1

一、Ollama 简介 比喻&#xff1a;Ollama 就像是一个“魔法箱子”&#xff0c;里面装满了各种大型语言模型&#xff08;LLM&#xff09;。你不需要懂复杂的魔法咒语&#xff08;配置&#xff09;&#xff0c;只需要轻轻一按&#xff08;一条命令&#xff09;&#xff0c;就能让…...

大模型基本原理(二)——ChatGPT的工作原理

如何得到一个ChatGPT&#xff1f; 1、无监督预训练&#xff1a;通过大量的文本数据集进行无监督训练&#xff0c;得到一个基座模型&#xff08;只会续写文本&#xff09; 2、监督微调&#xff1a;通过一些人类撰写的高质量对话数据对基座模型进行监督微调&#xff0c;得到一个…...

成为高能量体质:从身体神庙到精神圣殿的修炼之路

清晨五点&#xff0c;当城市还在沉睡&#xff0c;瑜伽垫上的汗水已经折射出第一缕阳光。这不是苦行僧的自虐&#xff0c;而是高能量体质者的日常仪式。在这个能量稀缺的时代&#xff0c;如何把自己修炼成一座小型核电站&#xff1f;答案就藏在身体的每个细胞里。 一、能量管理…...

51c自动驾驶~合集50

我自己的原文哦~ https://blog.51cto.com/whaosoft/13280022 #VLA 主流方案全解析 旨在让智能体在物理世界中通过感知、决策和行动来实现目标&#xff0c;而视觉 - 语言 - 动作&#xff08;VLA&#xff09;模型作为其中的关键技术&#xff0c;近年来备受关注。VLA 模型能够…...

测试自动化落地方向

一、视觉回归自动化测试&#xff08;低成本高回报&#xff09; 痛点&#xff1a; UI 频繁迭代导致视觉问题难覆盖 方案&#xff1a; 引入Applitools或SikuliX做视觉比对&#xff08;无需维护元素定位&#xff09; 关键路径截图比对&#xff0c;自动检测 UI 错位/样式问题 亮点…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

【嵌入式Linux应用开发基础】文件I/O基础编程

目录 一、文件I/O简介 二、文件描述符 2.1. 唯一性 2.2. 抽象性 2.3. 有限性 三、文件操作函数 四、标准文件I/O函数 五、文件执行权限 5.1. 权限类型 5.2. 权限分配对象 5.3. 权限表示方法 5.4. 权限设置命令 5.5. 权限设置的重要性 5.6. 实例说明 六、设备文件…...

Java 反射机制的安全隐患与防范措施:在框架开发与代码审计中的应用

前言 在 Java 编程的广阔领域中&#xff0c;反射机制堪称一把神奇且强大的钥匙&#xff0c;它为开发者打开了通往动态编程的全新大门。借助反射&#xff0c;Java 程序获得了在运行时自我审视和操作的独特能力&#xff0c;极大地增强了代码的灵活性与适应性。 简单来讲&#x…...

【JS】实现一个hexo插件并发布

hexo插件生成 在你的 hexo blog 目录&#xff0c;找到 node_modules. 新建一个文件夹。然后执行 npm init npm 会引导你生成 package.json 这是你的包的描述文件。需要注意的是&#xff0c;所有的 hexo 插件必须以 hexo - 开头&#xff0c;否则 hexo 不会加载。 如果hexo g中没…...

【Java 面试 八股文】MySQL 篇

MySQL 篇 1. MySQL中&#xff0c;如何定位慢查询&#xff1f;2. 那这个SQL语句执行很慢&#xff0c;如何分析呢&#xff1f;3. 了解过索引吗&#xff1f;&#xff08;什么是索引&#xff09;4. 索引的底层数据结构了解过吗&#xff1f;5. B树和B树的区别是什么呢&#xff1f;6.…...