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

【实体配置】.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 系列

🔸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!;//这样写
}

相关文章:

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

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…...

【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话

文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式&#xff1a;独立模式&#xff08;standalone&#xff09;和仲…...

【二分查找】力扣 34. 在排序数组中查找元素的第一个和最后一个位置

一、题目 二、思路 将题目转化为求解 target 和 target 1 的查找。分别采用最基础的二分查找即可。 三、题解 class Solution {public int[] searchRange(int[] nums, int target) {int n nums.length;int start lowerBound(nums, target);if (start n || nums[start] !…...

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…...

Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解

文章目录 前言一、简单工厂&#xff08;静态工厂&#xff09;1、概述2、代码实现3、优缺点 二、工厂方法模式1、概述2、代码实现3、优缺点 三、抽象工厂模式1、概述2、代码实现3、优缺点 四、总结 前言 先看个案例&#xff1a;【手机和手机店】在没有工厂的时候&#xff0c;手…...

KST-3D01型胎儿超声仿真体模、吸声材料以及超声骨密度仪用定量试件介绍

一、KST-3D01型胎儿超声仿真体模 KST—3D01型胎儿超声体模&#xff0c;采用仿羊水环境中内置胎龄为7个月大仿胎儿设计。用于超声影像系统3D扫描演示装置表面轮廓呈现和3D重建。仿羊水超声影像呈暗回声&#xff08;无回波&#xff09;特性&#xff0c;仿胎儿超声影像呈对比明显…...

网络原理->DNS协议和NAT协议解

前言 大家好我是小帅&#xff0c;今天我们来了解应用层的DNS协议和NAT技术 个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G 文章目录 1.重要应⽤层协议DNS(Domain Name System)1.1 DNS背景 2. NAT技术3. 总结 1.重要应⽤层协议DNS(Domain Name System) DNS是⼀整套从域…...

基于yolov8、yolov5的100种中药材检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…...

RuoYi排序

RuoYi框架提供了多种实现排序的方法&#xff0c;以满足不同场景下的需求。这里简要介绍几种常见的排序实现方式&#xff1a; 1. 后端排序 1.1 使用startPagePlus方法 RuoYi框架中&#xff0c;可以通过对BaseController进行扩展来实现更灵活的分页与排序功能。例如&#xff0…...

Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

我们在做数据之前要知道几个问题 1、在代码层面怎么来数据驱动 2、yaml文件是什么 3、怎么用yaml文件实现对应的数据驱动 我们用的是pytest框架所以相对来说是简单的&#xff0c;我们通过pytest框架来实现&#xff0c;而框架中要数据驱动用到我们装饰器就好啦pytest.mark.p…...

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题&#xff1f;最近遇到挺多工业相机维修咨询这个不能触发拍照的案例&#xff0c;所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…...

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…...

linux系统中常用文件日常使用命令记录

我们办公机是Ubuntu系统&#xff1b; 记录下工作中经常使用的几个文件或命令或一些零碎的知识点&#xff1a; &#xff08;该文档会持续更新&#xff09; 查看系统信息&#xff1a; uname -a cat /etc/product-info cat /etc/os-version 存放系统启停脚本 /etc/init.d/ 存放源…...

【C++打怪之路Lv16】-- map set

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…...

TPU-MLIR 项目源码结构分析

TPU-MLIR 项目源码结构分析 本文用作学习记录和交流分享&#xff0c;主要内容为 TPU-MLIR 的源码框架分析和构建流程分析。源码地址&#xff1a;https://github.com/sophgo/tpu-mlir 文件结构 从最外层开始分析 envsetup.sh 该脚本用于配置和初始化开发环境&#xff0c;其中…...

IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“

参考文章&#xff1a;https://blog.csdn.net/yueeryuanyi/article/details/14211090 问题&#xff1a;IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“编译都没问题 解决思路 – >【清除缓存】 1. 强制刷新Maven缓存 选择 Maven 标签&#xff0c;Exe…...

Sourcetree:一款强大的Git客户端

Sourcetree&#xff1a;一款强大的Git客户端 Sourcetree是一款由Atlassian开发的免费Git客户端&#xff0c;它提供了一个直观的图形界面&#xff0c;让用户能够轻松地管理他们的版本控制系统。无论是初学者还是有经验的开发者&#xff0c;Sourcetree都能提供方便快捷的Git操作…...

Linux环境变量与本地变量

文章目录 Linux环境变量与本地变量什么是环境变量查看环境变量设置环境变量本地变量命令行参数 Linux环境变量与本地变量 什么是环境变量 操作系统或运行时环境中存储的一些变量&#xff0c;用来存储与进程或系统相关的配置信息。这些变量在进程启动时由操作系统或Shell读取&…...

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…...

QT按下两次按钮,保存这期间内变换的QtextEdit控件内的数据

这个功能在项目中很常见&#xff0c;对界面里某个控件的数据进行记录&#xff0c;我这个是每秒记录5次&#xff0c;实际就是每200ms触发一次定时器&#xff0c;来满足需求。 .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QtSerialPort> …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...