【Db First】.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 系列

🔥Code First 代码优先,数据迁移,索引

DbFirst(数据库优先)‌是Entity Framework(EF)中的一种开发模式,其核心思想是先创建数据库,然后根据数据库的结构生成对应的实体类和数据访问代码。DbFirst模式适用于已经存在一个成熟的数据库,例如从旧系统迁移过来的数据库,或者数据库由专业的数据库管理员设计好,开发人员需要基于这个数据库来构建应用程序的情况‌。当然了,站在巨人的肩膀上,很多国产的ORM框架自出道也拥有该技能。

🟢优点和缺点

优点‌:

  • 灵活性‌:DbFirst 模式允许开发人员利用现有的数据库结构,减少重复工作。

  • 成熟度‌:适用于已有成熟数据库的情况,可以快速启动项目。

  • 可维护性‌:由于数据库结构已经存在,维护和修改数据库结构时更为方便。

缺点‌:

  • 依赖性‌:依赖于现有的数据库结构,可能无法完全满足业务需求的变化。

  • 灵活性差‌:在敏捷开发环境中,可能需要频繁调整数据库结构,这可能会影响开发效率。

01. 代码:快捷生成实体

✔️优点所有数据库都支持

只能满足常规要求,个性化太高的用 234方案

1. 代码生成实体到指定目录

//.net6以下
db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models");
 
//.net6以上 string加?
db.DbFirst.IsCreateAttribute().StringNullable().CreateClassFile("c:\\Demo\\1", "Models");
 
//参数1:路径  参数2:命名空间
//IsCreateAttribute 代表生成SqlSugar特性

新功能1: 格式化文件名

db.DbFirst.FormatFileName(x => x.ToLower()).CreateClassFile("c\\");
//格式化类名和字段名 看标题6

新功能2: NET 7 字符串是否需要?设置

db.DbFirst.StringNullable().CreateClassFile("c\\");//强制可以空类型string加上?

2. 生成实体并且带有筛选


db.DbFirst.Where("Student").CreateClassFile("c:\\Demo\\2", "Models");
db.DbFirst.Where(it => it.ToLower().StartsWith("view")).CreateClassFile("c:\\Demo\\3", "Models");
db.DbFirst.Where(it => it.ToLower().StartsWith("view")).CreateClassFile("c:\\Demo\\4", "Models");

3. 生成带有SqlSugar特性的实体

db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\5", "Models");

4.生成实体带有默认值

db.DbFirst.IsCreateDefaultValue().CreateClassFile("c:\\Demo\\6", "Demo.Models");
 
//5.1.4.108-preview12+ 支持了替换字符串
 db.DbFirst.Where("Student")
 .CreatedReplaceClassString(it=>it.Replace("xxx","yyy"))// 也可以用正则 Regex.Replace
 .CreateClassFile("c:\\Demo\\2", "Models");

5.自定义格式化功能

添加 SettingPropertyTemplate 重载,加强自定义属性的定义功能

  db.DbFirst
            //类
            .SettingClassTemplate(old => { return old;/*修改old值替换*/ })
            //类构造函数
            .SettingConstructorTemplate(old =>{return old;/*修改old值替换*/ })
             .SettingNamespaceTemplate(old => {
                            return old + "\r\nusing SqlSugar;"; //追加引用SqlSugar
                        })
            //属性备注
            .SettingPropertyDescriptionTemplate(old =>{ return old;/*修改old值替换*/})
             
            //属性:新重载 完全自定义用配置
            .SettingPropertyTemplate((columns,temp,type) => {
              
            var columnattribute = "\r\n           [SugarColumn({0})]";
            List<string> attributes = new List<string>();
            if (columns.IsPrimarykey)
                attributes.Add("IsPrimaryKey=true");
            if (columns.IsIdentity)
                attributes.Add("IsIdentity=true");
            if (attributes.Count == 0) 
            {
                columnattribute = "";
            }
            return temp.Replace("{PropertyType}", type)
                        .Replace("{PropertyName}", columns.DbColumnName)
                        .Replace("{SugarColumn}",string.Format(columnattribute,string.Join(",", attributes)));
              })
               
           .CreateClassFile("c:\\Demo\\7");

🚫 注意:该功能可能和 IsCreateAttribute 存在冲突一般不要一起使用

6.格式化类名和属性名

新功能:5.1.4.115

注意:FormatFileName(it=>it.Replace(" ","").Replace("-","_"))  要写成链式的,只能一个。

 db.DbFirst
        .IsCreateAttribute()//创建sqlsugar自带特性
        .FormatFileName(it => "File_" + it) //格式化文件名(文件名和表名不一样情况)
        .FormatClassName(it => "Class_" + it)//格式化类名 (类名和表名不一样的情况)
        .FormatPropertyName(it => "Property_" + it)//格式化属性名 (属性名和字段名不一样情况)
        .CreateClassFile("c:\\Demo\\4", "Models");
         
         
//注意只能写一个
 
//正确 
FormatFileName(it=>it.Replace(" ","").Replace("-","_")) 
 
//错误
.FormatFileName(it=>it.Replace(" ",""))  
.FormatFileName(it=>it.Replace("-","_"))

7. 替换生成后的 ClassString

🚫 注意:这个替换性能损耗最大,能用其他功能替换优先其他功能替换

//5.1.4.108-preview12+ 支持了替换字符串
 db.DbFirst.Where("Student")
 .CreatedReplaceClassString(it=>it.Replace("xxx","yyy"))//也可以用正则 Regex.Replace
 .CreateClassFile("c:\\Demo\\2", "Models");

8.添加租户


 db.DbFirst.Where("order").SettingClassDescriptionTemplate(it => {
         return it+"\r\n    [Tenant(\""+db.CurrentConnectionConfig.ConfigId+"\")]";
 }).CreateClassFile("c:\\Demo\\1", "Models");

9. 生成String? .NET 7+

db.DbFirst.StringNullable().CreateClassFile("c\\");//强制可以空类型string加上?

02. 代码:Razor 模版生成

1.使用用例

    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
                ConnectionString = Config.ConnectionString,
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    RazorService = new RazorService()//新建一个RazorService类 
                }
     });
 
    var templte = RazorFirst.DefaultRazorClassTemplate;//这个是自带的,这个模版可以修改
    db.DbFirst.UseRazorAnalysis(templte).CreateClassFile("c:\\Demo\\Razor\\");

RazorService 类在 framework和 .net Core 中小有区别看下面例子

2. net  framework 

创建 RazorService 需要安装 RazorEngine 3.10.0.0  

using RazorEngine;
using RazorEngine.Templating;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace SqlSugar.DbFirstExtensions
{
    public class RazorService : IRazorService
    {
        public List<KeyValuePair<string,string>> GetClassStringList(string razorTemplate, List<RazorTableInfo> model)
        {
            if (model != null && model.Any())
            {
                var  result = new List<KeyValuePair<string, string>>();
                foreach (var item in model)
                {
                    try
                    {
                        item.ClassName = item.DbTableName;//格式化类名
                        string key = "RazorService.GetClassStringList"+ razorTemplate.Length;
                        var classString = Engine.Razor.RunCompile(razorTemplate, key, item.GetType(), item);
                        result.Add(new KeyValuePair<string,string>(item.ClassName,classString));
                    }
                    catch (Exception ex)
                    {
                        new Exception(item.DbTableName + " error ." + ex.Message);
                    }
                }
                return result;
            }
            else
            {
                return new List<KeyValuePair<string, string>> ();
            }
        }
    }
}

3. net core |.net5 | .net6

创建 RazorService 需要安装 RazorEngine.NetCore 3.1

using RazorEngine;
using RazorEngine.Templating;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace DbFirstRazorTest
{
    class Program
    {
        static void Main(string[] args)
        {
 
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "server=.;uid=sa;pwd=sasa;database=SQLSUGAR4XTEST",
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    RazorService = new RazorService()
                }
            });
 
            db.DbFirst.UseRazorAnalysis(RazorFirst.DefaultRazorClassTemplate).CreateClassFile("c:\\Demo\\Razor\\");
 
        }
    }
    public class RazorService : IRazorService
    {
        public List<KeyValuePair<string, string>> GetClassStringList(string razorTemplate, List<RazorTableInfo> model)
        {
            if (model != null && model.Any())
            {
                var result = new List<KeyValuePair<string, string>>();
                foreach (var item in model)
                {
                    try
                    {
                        item.ClassName = item.DbTableName;//格式化类名
                        string key = "RazorService.GetClassStringList" + razorTemplate.Length;
                        var classString = Engine.Razor.RunCompile(razorTemplate, key, item.GetType(), item);
                        result.Add(new KeyValuePair<string, string>(item.ClassName, classString));
                    }
                    catch (Exception ex)
                    {
                        new Exception(item.DbTableName + " error ." + ex.Message);
                    }
                }
                return result;
            }
            else
            {
                return new List<KeyValuePair<string, string>>();
            }
        }
    }
}

03. 工具ReZero生成实体

缺点:只支持常用数据库  SqlServer、MySql、 Pgsql 、Oracle、Sqlite、达梦 和 金仓(默认模式),我觉着这不算啥缺点了,该有的都有了。

优点:  界面操作 、修改模版方便

.NET 新代码生成器 ReZero.API - .NET 新代码生成器 - .NET果糖网

04. 获取表和列信息

下面方法可以拿到表信息,用途还是蛮多的。

//例1 获取所有表
var tables = db.DbMaintenance.GetTableInfoList(false);//true 走缓存 false不走缓存
foreach (var table in tables)
{
     Console.WriteLine(table.Description);//输出表信息
}

下面方法可以拿到列信息,用途还是蛮多的。

 db.DbMaintenance.GetColumnInfosByTableName(表名, false)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell综合

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

Ubutuns服务器搭建与维护

1.靶机搭建 首先&#xff0c;安装 Apache2 作为 Web 服务器&#xff1a; sudo apt install apache2 安装完成后&#xff0c;可以启动 Apache 服务并确保它开机自启&#xff1a; sudo systemctl start apache2 sudo systemctl enable apache2然后&#xff0c;你可以通过访问…

003 LVGL相关文件分析

LVGL移植相关文件&#xff1a; 显示设备接口文件 lv_port_disp_templ.c/输入设备接口文件 lv_port_indev_templ.c/h 裁剪、配置文件 lv_conf.h lv_conf.h文件内容介绍&#xff1a; 对应中文翻译版本&#xff1a; #if 1 /* 设置为1&#xff0c;以启…

阿里巴巴即将超越OpenAI的o1?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Web自动化测试教程详解(附文档一份)

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

外包干了两年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;曾在外包干了2年多的功能测试&#xff0c;再加上大环境不好&#xff0c;那时我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;所以当时我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

【线程】Java多线程代码案例(2)

【线程】Java多线程代码案例&#xff08;2&#xff09; 一、定时器的实现1.1Java标准库定时器1.2 定时器的实现 二、线程池的实现2.1 线程池2.2 Java标准库中的线程池2.3 线程池的实现 一、定时器的实现 1.1Java标准库定时器 import java.util.Timer; import java.util.Timer…

pyspark实现基于协同过滤的电影推荐系统

最近在学一门大数据的课&#xff0c;课程要求很开放&#xff0c;任意做一个大数据相关的项目即可&#xff0c;不知道为什么我就想到推荐算法&#xff0c;一直到着手要做之前还没有新的更好的来代替&#xff0c;那就这个吧。 推荐算法 推荐算法的发展由来已久&#xff0c;但和…

log4c库使用

log4c库 介绍 log4c 是一个 C 语言实现的日志库&#xff0c;它是 log4j&#xff08;Java 语言的日志框架&#xff09;的 C 语言版本&#xff0c;旨在为 C 语言应用程序提供灵活、可配置的日志功能。log4c 提供了丰富的日志功能&#xff0c;包括日志级别、日志输出目标、日志格…

Llmcad: Fast and scalable on-device large language model inference

题目&#xff1a;Llmcad: Fast and scalable on-device large language model inference 发表于2023.09 链接&#xff1a;https://arxiv.org/pdf/2309.04255 声称是第一篇speculative decoding边缘设备的论文&#xff08;不一定是绝对的第一篇&#xff09;&#xff0c;不开源…

Leetcode 每日一题 36.有效的数独

目录 问题描述 输入输出格式 算法思路 过题图片 代码实现 题目链接 复杂度分析 问题描述 给定一个 9x9 的数独棋盘&#xff0c;我们需要判断棋盘上已填入的数字是否有效。根据数独的规则&#xff0c;有效性需要满足以下条件&#xff1a; 数字 1-9 在每一行只能出现一次…

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍深入理解TTY体系&#xff1a;设备节点与驱动程序框架详解Linux串口应用编程&#xff1a;从UART到GPS模块及字符设备驱动 解UART 子系统&#xff1a;Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

韦东山stm32hal库--定时器喂狗模型按键消抖原理+实操详细步骤

一.定时器按键消抖的原理: 按键消抖的原因: 当我们按下按键的后, 端口从高电平变成低电平, 理想的情况是, 按下, 只发生一次中断, 中断程序只记录一个数据. 但是我们使用的是金属弹片, 实际的情况就是如上图所示, 可能会发生多次中断,难道我们要记录3/4次数据吗? 答:按键按下…

Web前端学习_CSS盒子模型

content padding border margin <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS盒子模型</title><style></style> </head> <body> <div class"demo&quo…

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者&#xff1a;来自 Elastic Annie Hansen, Stef Nestor 在本博客中&#xff0c;我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud&#xff08;企业版&#xff09;中&#xff0c;Elastic 在其 found-snapshots 存储…

部署 Prometheus

实验环境 IP地址服务192.168.88.10Prometheus服务端, Consul, Grafana, Node-Exporter192.168.88.77MySQL, Node-Exporter192.168.88.30Nginx&#xff0c;Node-Exporter 一、Prometheus Server 端安装和相关配置 【Prometheus1.sh】 &#xff08;1&#xff09;上传 prometh…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…

Cobalt Strike 4.8 用户指南-第十一节 C2扩展

11.1、概述 Beacon 的 HTTP 指标由 Malleable Command and Control &#xff08;Malleable C2&#xff09; 配置文件控制。Malleable C2 配置文件是一个简单的程序&#xff0c;它指定如何转换数据并将其存储在事务中。转换和存储数据的同一程序&#xff08;向后解释&#xff0…