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

【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)

http://www.lryc.cn/news/493380.html

相关文章:

  • MySQL聚合查询分组查询联合查询
  • 告别照相馆!使用AI证件照工具HivisionIDPhotos打造在线证件照制作软件
  • 通信原理第三次实验
  • 【halcon】Metrology工具系列之 get_metrology_object_result_contour
  • A052-基于SpringBoot的酒店管理系统
  • NLP信息抽取大总结:三大任务(带Prompt模板)
  • python常见问题-pycharm无法导入三方库
  • 迅为RK3588开发板Android系统开发笔记-使用ADB工具
  • 什么是分布式数据库?
  • Leetcode 3363. Find the Maximum Number of Fruits Collected
  • 【数据仓库 | Data Warehouse】数据仓库的四大特性
  • springboot配置多数据源mysql+TDengine保姆级教程
  • dns实验2:反向解析
  • ZooKeeper 基础知识总结
  • npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法
  • 微信小程序蓝牙writeBLECharacteristicValue写入数据返回成功后,实际硬件内信息查询未存储?
  • 5G NR:带宽与采样率的计算
  • go 和java 编写方式的理解
  • C# 7.1 .Net Framwork4.7 VS2017环境下,方法的引用与调用
  • etcd、kube-apiserver、kube-controller-manager和kube-scheduler有什么区别
  • 每日一题 LCR 057. 存在重复元素 III
  • 使用IDEA编写测试用例,复杂度校验
  • 搭建私有云存储
  • 【从零开始的LeetCode-算法】3304. 找出第 K 个字符 I
  • 深入解析分布式遗传算法及其Python实现
  • gitee:创建仓库,存入本地文件至仓库
  • 计算分数的浮点数值
  • 在 C/C++ 中,volatile 关键字的作用是什么?.volatile 关键字与 const 关键字有什么区别?
  • golang debug调试
  • 自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析