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