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

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…...

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法&#xff08;Lamport 算法&#xff09;调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中&#xff0c;多个应用服务可能会同时…...

木材表面缺陷检测数据集,支持YOLO+COCO JSON+PASICAL VOC XML+DARKNET格式标注信息,平均正确识别率95.0%

数据集说明 木材表面缺陷检测数据集是用于训练和验证人工智能算法&#xff0c;以帮助自动识别和检测木材表面的缺陷&#xff0c;如裂纹、疤痕、孔洞等。这对于木材行业非常重要&#xff0c;可以提高生产过程的效率和质量控制水平。 本文提供的木材表面缺陷检测数据集&#xff0…...

Leetcodehot 力扣热题100 二叉搜索树中第 K 小的元素

class Solution { public:int res; // 用于存储第 k 小的元素int kthSmallest(TreeNode* root, int k) {inorder(root, k); // 进行中序遍历并找到第 k 小的元素return res; // 返回结果}private:// 中序遍历&#xff1a;遍历树的左子树、根节点和右子树void inorder(TreeNod…...

Awtk 如何添加开机画面

场景 我们知道在工程中&#xff0c;Ui是一个线程&#xff0c;并且需要一直存在&#xff0c;当我们使用的开机画面在这个线程开启就直接展示的时候&#xff0c;因为awtk的界面是window_open入栈的&#xff0c;即首次打开的窗口会记录在top&#xff0c;往后的窗口会依次往后存放&…...

关于多语言商城系统的开发流程

建设多语言商城系统是现在很多传统外贸企业的选择&#xff0c;外贸企业通过多语言电商系统开展海外业务&#xff0c;那么多语言商城系统的开发流程是怎么样的呢&#xff1f;接下来就跟着小来一起来看看吧。 1、页面UI设计 多语言商城系统的原型图经过反复推敲修正后&#xff0…...

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

计算机视觉-拟合

一、拟合 拟合的作用主要是给物体有一个更好的描述 根据任务选择对应的方法&#xff08;最小二乘&#xff0c;全最小二乘&#xff0c;鲁棒最小二乘&#xff0c;RANSAC&#xff09; 边缘提取只能告诉边&#xff0c;但是给不出来数学描述&#xff08;应该告诉这个点线是谁的&a…...

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…...

DeepSeek模拟阿里面试——Mysql

1.数据库基础知识 关系型数据库是什么&#xff1f; 关系型数据库是基于关系模型的数据库&#xff0c;使用表格来存储数据&#xff0c;表格之间可以通过键建立关系。 数据库的ACID特性是什么&#xff1f; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务要么全部完成…...

MVVM设计模式

‌MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件设计模式,MVVM模式由三个主要部分组成&#xff1a; ‌Model&#xff08;模型&#xff09;‌&#xff1a;负责管理应用程序的业务逻辑和数据。它不关心UI如何展示数据&#xff0c;主要负责与服务器通信和数据处处…...

解决:Cannot find a valid baseurl for repo: base/7/x86_64

传送门 repo_file/etc/yum.repos.d/CentOS-Base.repo cp ${repo_file} ~/CentOS-Base.repo.backup sudo sed -i s/#baseurl/baseurl/ ${repo_file} sudo sed -i s/mirrorlist.centos.org/vault.centos.org/ ${repo_file} sudo sed -i s/mirror.centos.org/vault.centos.org/ $…...

ffmpeg -codecs

1. ffmpeg -codecs -loglevel quiet 显示ffmpeg支持的编解码器 2. 输出 选取部分结果&#xff1a; Codecs: D..... Decoding supported .E.... Encoding supported ..V... Video codec ..A... Audio codec ..S... Subtitle codec ...I.. Intra frame-only code…...

社区版IDEA中配置TomCat(详细版)

文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版&#xff0c;没有自带的tomcat server&#xff0c;所以在设置的插件里面搜索&#xff0c;安装第一个&#xff08;注意&#xff1a;安装时一定要关闭外网&#xff0c;小编因为这个…...

强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略

目录 一、引言二、强化学习基础回顾&#xff08;一&#xff09;策略&#xff08;二&#xff09;价值函数 三、近端策略优化&#xff08;PPO&#xff09;算法&#xff08;一&#xff09;算法原理&#xff08;二&#xff09;PPO 目标函数&#xff08;三&#xff09;代码示例&…...

长安链支撑全国不动产登记数据可信流通

转自人民日报客户端 不动产登记事关亿万企业、家庭的切身利益。促进不动产登记数据安全流通、业务高效协同&#xff0c;是各方持续努力的目标。记者1月7日从国家区块链技术创新中心获悉&#xff0c;我国自主可控、性能领先的区块链软硬件技术体系长安链&#xff0c;支撑自然资…...

GitCode 助力 Dora SSR:开启游戏开发新征程

项目仓库&#xff08;点击阅读原文链接可直达&#xff09; https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱&#xff0c;构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望&#xff0…...

获取 Windows 视频时长的正确方式——Windows Shell API 深度解析

在 Qt 开发中,有时需要获取视频文件的时长,最直接的方法是在 Windows 上使用 Windows Shell API。然而,这涉及到 IShellItem、IPropertyStore 等 COM 组件,并需要正确处理 PKEY_Media_Duration。本篇文章将详细解析 Windows Shell API 获取视频时长的正确实现方式,并解决常…...

Linux系统安装Nginx详解(适用于CentOS 7)

目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx&#xff08;可选&#xff09; 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

深入理解Java对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...