【Db First】.NET开源 ORM 框架 SqlSugar 系列

发布于:2024-11-29 ⋅ 阅读:(20) ⋅ 点赞:(0)

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