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

【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.kler.cn/a/414780.html

相关文章:

  • React 前端框架深度剖析
  • js中判断数组和判断对象的方法
  • 【选择排序和交换排序】直接选择排序、堆排序、冒泡排序、快速排序
  • IDEA:配置Serializable class without ‘serialVersionUID’ 找不到
  • 操作系统的发展趋势是什么
  • 计算机网络:应用层知识点概述及习题
  • Github 2024-11-28 Go开源项目日报Top10
  • pyspark实现基于协同过滤的电影推荐系统
  • MQ高级2:MQ的可靠性
  • 鸿蒙开发-在ArkTS中制作音乐播放器
  • GDPU Android移动应用 数据存储
  • [Redis#5] hash | 命令 | 内部编码 | 应用 | cache: string, json, hash对比
  • 英语-日常笔记
  • 大数据 HDFS和MapReduce综合实训
  • BAT WPS OFFICE免登录工具
  • hadoop_zookeeper详解
  • 云原生时代的轻量级反向代理Traefik
  • 《C++搭建神经网络基石:开启智能编程新征程》
  • IDEA 2024 Maven 设置为全局本地仓库,避免新建项目重新配置maven
  • 2024-11-25 二叉树的定义
  • Java基础之控制语句:开启编程逻辑之门
  • 国外媒体发布新闻稿/海外媒体网站发稿创历史新潮流
  • C# 基于WPF实现数据记录导出excel
  • COMSOL工作站:配置指南与性能优化
  • 单片机知识总结(完整)
  • 网络安全概论——网络加密与密钥管理