【实体配置】.NET开源 ORM 框架 SqlSugar 系列

 .NET开源 ORM 框架 SqlSugar 系列

  1. 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  2. 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
  3. 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
  4. 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  5. 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  6. 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  7. 【连接池】.NET开源 ORM 框架 SqlSugar 系列
  8. 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
  9. 【查询基础】.NET开源 ORM 框架 SqlSugar 系列

🔸ORM实体的定义和作用:

ORM实体通过映射关系将数据库表中的数据与应用程序中的对象关联起来。这种映射关系使得开发者可以通过操作对象来执行数据库操作,如增加、删除、查询和更新数据,而不需要直接编写SQL语句。

🔸 这样做的好处包括:

  1.  简化数据库操作‌:通过操作对象来执行数据库操作,避免了直接编写SQL语句的复杂性。

  2.  提高开发效率‌:ORM框架提供了丰富的API和工具,使得数据库操作更加便捷和高效。

  3.  增强代码的可维护性‌:通过对象关系映射,代码与数据库的耦合度降低,便于维护和升级。

1、实体使用自带特性 ☘️

 1.1 使用用例

对于 CRUD来说只需要配置主键自增列就行了 ,如果类的名称和数据库不一样可以设置数据库中的名称。如果主键类型不是int类型就不需要设置自增,下面有介绍,比如GUID、雪花ID等等。

#主键自增#

SugarTable("dbstudent")]//当和数据库名称不一样可以设置表别名 指定表明
public class Student
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增 public int Id { get; set; }public int? SchoolId { get; set; }[SugarColumn(ColumnName ="StudentName")]//数据库与实体不一样设置列名 public string Name { get; set; }
}

#双主键、复合主键、联合主键、多个主键#

表中字段如果是自增需要加上 IsIdentity,否则不需要

public class Student
{[SugarColumn(IsPrimaryKey = true)] //设置主键public Guid  Pk1{ get; set; }[SugarColumn(IsPrimaryKey = true)] //设置主键public Guid  Pk2{ get; set; }public string Name { get; set; }
}

#无主键#

当表中无主键的时候更新和删除,需要指定条件,具体用法看文档

public class Student
{public Guid Id{ get; set; }public string Name { get; set; }
}

📢 总结:只需要针对数据库中的 自增和主键进行设置即可,和数据库一致

 1.2 特性明细

下面是CRUD用到的特性,不包含建表的属性 (建表看文档【迁移】)

IsIdentity

是自增列

如果是Oracle12+需要启用看文档: Oracle

如果是Oracle11及以下请设置OracleSequenceName 设置后和自增一样使用

IsPrimaryKey

true是主键

ColumnName

实体类数据库列名不一样设置数据库列名

IsIgnore

IsIgnore=true表示 ORM 所有操作不处理这列

一般用于数据库没有这一列

ORM 非数据库列加上该特性(配置导航查询自动IsIgnore=true)

IsOnlyIgnoreInsert

插入操作时不处理该列 【插入中忽略】 对数据库默认值有效

IsOnlyIgnoreUpdate

更新操作不处理该列 【更新中忽略】

InsertServerTime 

插入操作:true数据库时间

UpdateServerTime 

更新操作:true数据库时间

InsertSql

插入根据SQL

等于"0"插入0 

等 于"'a'" 插入a

等于 "newid()" 插入newid()

5.1.4.151支持了格式化 "数据库函数('{0}')"

UpdateSql

更新根据SQL

等于"0"更新0 

等 于"'a'" 更新a

等于 "newid()" 更新newid()

5.1.4.151支持了格式化 "数据库函数('{0}')"

QuerySql

5.1.4.128+

用于单表查询在没有使用Select下根据Sql生成

例如等于" Cast( Num_float64 as varchar(500))"

生成的Sql :  Cast( Num_float64 as varchar(500)) AS Num_float64 

一般用于orm驱动不支持的类型并且自定义类型也失效的情况

只在单表查询,不使用Select的情况下才生效

注意:

联表或者SELECT使用  函数或者扩展函数实现

OracleSequenceName

设置Oracle序列,设置后该列等同于自增列 ,看文档: Oracle

MaxParameterNameLength

一般等于30,用于处理Oracle11 :参数化名字和索引名字超过30

建表看文档【迁移】,这边只介绍CRUD用到的属性

2、实体使用自定义特性 ✅

下面是实现自定义特性的例子

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{ConnectionString = Config.ConnectionString,DbType = DbType.SqlServer,IsAutoCloseConnection = true,ConfigureExternalServices = new ConfigureExternalServices(){EntityService = (property, column) =>{var attributes = property.GetCustomAttributes(true);//get all attributes if (attributes.Any(it => it is KeyAttribute))// by attribute set primarykey{column.IsPrimarykey = true; //有哪些特性可以看 1.2 特性明细}//可以写多个,这边可以断点调试// if (attributes.Any(it => it is NotMappedAttribute))//{//    column.IsIgnore= true; //}},EntityNameService = (type, entity) =>{var attributes = type.GetCustomAttributes(true);if (attributes.Any(it => it is TableAttribute)){var attr=(attributes.First(it=>it is TableAttribute) as TableAttribute);entity.DbTableName = attr.Name;}}}
});[Table("student")]
//[SugarTable("student")]
public class MyStudent
{[Key]//[SugarColumn(IsPrimaryKey =true)]public string Id { get; set; }public string Name { get; set; }
}

该功能非常强大远不止这点用法,可以统一处理一些特性逻辑

3、实体不使用特性 

3.1 无封装写法

根据规则来设置哪个是主键,哪个是自增,这样就不需要在实体加特性了(SqlSugar只需主键和自增就可以完成所有操作)。

📢 推荐:我个人推荐这样写,假如当我们切换ORM框架时,如果在实体配置了很多SqlSugar特有的特性时,清理起来还是比较费时间的,如果统一配置,更改岂不是更省事,您觉着呢?

var db= new SqlSugarClient(new ConnectionConfig()
{DbType = SqlSugar.DbType.MySql,ConnectionString = Config.ConnectionString,IsAutoCloseConnection = true,ConfigureExternalServices=new ConfigureExternalServices() {EntityService = (t, column) => {if (column.PropertyName.ToLower() == "id") //是id的设为主键{column.IsPrimarykey = true;if (column.PropertyInfo.PropertyType == typeof(int)) //是id并且是int的是自增{column.IsIdentity = true;}}},EntityNameService = (type, entity) =>{//entity.DbTableName 修改表名}
}
});
//根据你自个的逻辑去设置相应的主键和自增,也可以从数据库读出主键和自增来动态设置
//db.DbMaintenance.GetColumnInfosByTableName 可以拿到表的信息

3.2 语法糖(5.1.45)🔥

如果大量 if else 比较难看所以针对指定表进行了一些封

类似 fluent api

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{DbType = DbType.SqlServer,ConnectionString = Config.ConnectionString3,InitKeyType = InitKeyType.Attribute,IsAutoCloseConnection = true,ConfigureExternalServices = new ConfigureExternalServices(){EntityService = (s, p) =>{//如果是Order实体进行相关配置p.IfTable<Order>().UpdateProperty(it => it.id, it =>{it.IsIdentity = true;it.IsPrimarykey = true;}).UpdateProperty(it => it.Name, it => {it.Length = 100;it.IsNullable = true;}).OneToOne(it => it.Item, nameof(Order.ItemId));//如果Custom实体进行相关配置p.IfTable<Custom>().UpdateProperty(it => it.id, it =>{it.IsIdentity = true;it.IsPrimarykey = true;}).UpdateProperty(it => it.Text, it => {it.DataType= StaticConfig.CodeFirst_BigString;//支持多库的MaxString用法})//好处就是配置导航方便,和针对指定表设置会方便些//可以结合全局逻辑一起使用,如果下面逻辑和上面有冲突,下面的会覆盖上面的//统一设置 nullable等于isnullable=trueif(p.IsPrimaryKey==false&&new NullabilityInfoContext().Create(c).WriteState is NullabilityState.Nullable){p.IsNullable = true;}},EntityNameService = (type, entity) =>{//entity.DbTableName 修改表名}}
});
//性能说明:
//EntityService 相同实体只会执行一次性不需太操作

4、迁移建表

✔️现在基本成熟点的后端框架都有Code First 功能,主打一个开箱即可用。想当年我们还得手动创建数据库,手动执行初始化脚本,现在越来越人性化了。

public class CodeFirstTable1
{[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]public int Id { get; set; } public string Name { get; set; }//ColumnDataType 一般用于单个库数据库,如果多库不建议用[SugarColumn(ColumnDataType = "Nvarchar(255)")]public string Text { get; set; }[SugarColumn(IsNullable = true)]//可以为NULLpublic DateTime CreateTime { get; set; }
}//建表
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));

详细文档:【Code First】.NET开源 ORM 框架 SqlSugar 系列

5、生成实体

✔️作为楼上的兄弟Db First 却肩负着另一项任务,那就是先有数据库后根据数据表生成实体。很多小伙伴在开发项目时喜欢以数据库设计起手。还一个就是在线库表操作也需要用到这个技术,实时同步更新实体,做到不碰数据库也能维护库表。

//.net6以下
db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models");//.net6以上 string加?
db.DbFirst.IsCreateAttribute().StringNullable().CreateClassFile("c:\\Demo\\1", "Models");

详细文档:【Db First】.NET开源 ORM 框架 SqlSugar 系列

8、.NET6+ 非空string编译警告

不要使用 required ,通过下面写法实现

public class Order
{[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public string Name { get; set; } = null!;//这样写
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/482816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机卡限速丨中国移动5G变3G,网速500kb

以下猜测错误&#xff0c;又有新的猜测&#xff1a;河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起&#xff0c;中国移动集团内部将开启跨省流量结算” 在深圳四五年了&#xff0c;之前没有过&#xff0c;就从上个月开始。11月底解除限速&#xff0c;12月刚开…

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库&#xff0c;实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…

Flink双流Join

在离线 Hive 中&#xff0c;我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢&#xff1f;Flink DataStream API 为我们提供了3个算子来实现双流 join&#xff0c;分别是&#xff1a; join coGroup intervalJoin 下面我们分别详细看一下这…

Vue3学习宝典

1.ref函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 import { ref } from vue // 简…

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…

《DSL-FIQA》论文翻译

《DSL-FIQA: Assessing Facial Image Quality Via Dual-Set Degradation Learning and Landmark-Guided Transformer》 原文链接&#xff1a;DSL-FIQA: Assessing Facial Image Quality via Dual-Set Degradation Learning and Landmark-Guided Transformer | IEEE Conference…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

vue基础之6:计算属性、姓名案例、简写计算属性

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

Qt桌面应用开发 第十天(综合项目二 翻金币)

目录 1.主场景搭建 1.1重载绘制事件&#xff0c;绘制背景图和标题图片 1.2设置窗口标题&#xff0c;大小&#xff0c;图片 1.3退出按钮对应关闭窗口&#xff0c;连接信号 2.开始按钮创建 2.1封装MyPushButton类 2.2加载按钮上的图片 3.开始按钮跳跃效果 3.1按钮向上跳…

【从零开始的LeetCode-算法】35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入: …

掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)

前面化解了Micro_ROS通讯问题&#xff0c;并在 RT-Thread Studio 环境下&#xff0c;使用Micro_ROS软件包中的例程&#xff0c;实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c &#xff0c;实现了接收 turtle_teleop_key 所发出的 turtle…

展现运动类型

同样&#xff0c;我们通过函数的方式将运动类型插入我们的HTML代码中 _renderWorkout(workout) {let html <li class"workout workout-${workout.type}" data-id"${workout.id}"><h2 class"workout__title">${workout.description}…

vscode 怎么下载 vsix 文件?

参考&#xff1a;https://marketplace.visualstudio.com/items?itemNameMarsCode.marscode-extension 更好的办法&#xff1a;直接去相关插件的 github repo 下载老版本 https://github.com/VSCodeVim/Vim/releases?page5 或者&#xff0c;去 open-vsx.org 下载老版本 点击这…

python 练习题

目录 1&#xff0c;输入三个整数&#xff0c;按升序输出 2&#xff0c;输入年份及1-12月份&#xff0c;判断月份属于大月&#xff0c;小月&#xff0c;闰月&#xff0c;平月&#xff0c;并输出本月天数 3&#xff0c;输入一个整数&#xff0c;显示其所有是素数因子 4&#…

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…

Rook入门:打造云原生Ceph存储的全面学习路径(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.2 获取rook最新版本3.3 rook资源文件目录结构3.4 部署Rook/CRD/Ceph集群3.5 查看rook部…

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…

奇数求和ᅟᅠ

奇数求和 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 计算非负整数 m 到 n&#xff08;包括m 和 n &#xff09;之间的所有奇数的和&#xff0c;其中&#xff0c;m 不大于 n&#xff0c;且n 不大于30…