当前位置:   article > 正文

SqlSugar框架的学习

sqlsugar

SqlSugar ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 (donet5.com)

参考文档:

基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中_倾听铃的声的博客-CSDN博客_sqlsugar 多库

C# 数据操作系列 - 14 深入探索SqlSugar_chinaherolts2008的博客-CSDN博客

SqlSugar轻量ORM - 張暁磊 - 博客园 (cnblogs.com)

一.配置SqlSuagr连接到SqlServer数据库

1.创建一个ConnectionConfig

(1)主要函数

  1. public static ConnectionConfig BuildConnConfig(dynamic configId, DbType dbType, string connectionString)
  2. {
  3. return new ConnectionConfig()
  4. {
  5. ConfigId = configId,
  6. DbType = dbType, //数据库类型
  7. ConnectionString = connectionString,//连接字符串
  8. IsAutoCloseConnection = true, //自动释放和关闭数据库连接,如果有事务事务结束时关闭,否则每次操作后关闭//是否自动释放数据库(默认false),设为true我们不需要close或者Using的操作,比较推荐
  9. MoreSettings = new ConnMoreSettings()//更多设置
  10. {
  11. IsWithNoLockQuery = true //true表示可以自动删除二级缓存
  12. },
  13. //InitKeyType = InitKeyType.Attribute,//默认就是这个,从实体特性中读取主键自增列信息,初始化主键和自增列信息到ORM的方式
  14. AopEvents = new AopEvents //调试SQL事件,可以删掉
  15. {
  16. OnLogExecuting = (sql, p) =>
  17. {
  18. p.ToDictionary(it => it.ParameterName, it => it.Value);
  19. System.Diagnostics.Trace.WriteLine(sql);
  20. System.Diagnostics.Trace.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value)));
  21. }
  22. }
  23. };
  24. }

(2)传参

在一个json文件中配置好了数据库的参数

 到时候直接读取json,并转换成一个实体类的对象

  1. if (!db.Enabled)//判断这个连接是否有用
  2. {
  3. return;
  4. }
  5. //db是那个实体类的对象
  6. DbType dbType = (DbType)System.Enum.Parse(typeof(DbType), db.DbType.ToString());
  7. SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder(db.ConnectionString);
  8. ConnectionConfig dbConfig = DbContext.BuildConnConfig(db.ConfigId, dbType, sqlcsb.ToString());

2.初始化数据库连接

  1. public static void SetupDBConnectionConfig(List<ConnectionConfig> connectionConfigs)
  2. {
  3. if (db != null)
  4. {
  5. db.CommitTran();//存自最后一个BeginTrans方法调用以来的所有更改,并结束当前事务。
  6. db.Dispose();//回滚任何挂起的事务,清空了connectionString,下次用在new connection,不会报错
  7. return;
  8. }
  9. //因为SqlSugarScope继承成IDisposable,如果不是全局使用,可以使用using自动释放资源,然后在using的大括号内进行配置
  10. db = new SqlSugarScope(connectionConfigs);
  11. //SetDbFirst();
  12. //SetCodeFirst();
  13. }

3.DbFirst

  1. public static void SetDbFirst()
  2. {
  3. //根据数据库生成对应的类,其他方法看官网
  4. db.DbFirst.IsCreateAttribute().CreateClassFile(@"D:\0.data\VSCode\ReportGeneration\Models\1", "Models");//第二个参数可以缺省
  5. //加 @表示无视转义符的存在。比如@”\n" 不是表示换行,而是表示\和n,否则要\\
  6. //采用Dbfirst时,建议先生成一个类库(需要添加SqlSugar的包),然后生成路径设为这个类库下的一个新的文件夹
  7. //如果文件没有显示(和这个类库的csproj文件有关,可以打开查看只有里面有的文件名才能显示)
  8. //可以点显示所有文件查看是否存在(资源管理器刷新右边第2个按钮)
  9. //如果存在且没有显示,则在桌面打开文件夹拖进左侧的类库下,没有的类删掉
  10. }

4. CodeFirst

  1. public static void SetCodeFirst()
  2. {
  3. //首先要引用上面创建的数据库类库
  4. Assembly assembly = Assembly.LoadFrom("Models.dll");//使用反射加载程序集并执行方法
  5. IEnumerable<Type> typelist = assembly.GetTypes().Where(c => c.Namespace == "Models");//获取此程序集中定义的类型,且命名空间=Models的,where可以不用
  6. bool Backup = false;//是否备份
  7. db.DbMaintenance.CreateDatabase(); //创建一个数据库出来
  8. if (Backup)
  9. {
  10. db.CodeFirst.BackupTable().InitTables(typelist.ToArray());
  11. }
  12. else
  13. {
  14. db.CodeFirst.InitTables(typelist.ToArray());
  15. }
  16. //在下面可以初始化种子数据
  17. }

 7.Model类的属性特性

  1. namespace TemplateNode.Models
  2. {
  3. [SugarTable("BaseNode2")]//当类名和表名不一样时可以设置表别名 指定表明
  4. public class BaseNode
  5. {
  6. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//IsPrimaryKey是主键,IsIdentity是自增
  7. public int Id { get; set; }
  8. [SugarColumn(ColumnName = "Name2", ColumnDescription = "注释")]
  9. //ColumnName:属性名和表中的列名不一样 设置列名,ColumnDescription:设置表的备注
  10. public string Name { get; set; }
  11. [SugarColumn(IsIgnore = true)]//IsIgnore表示ORM不处理该列
  12. public string Description { get; set; }
  13. [SugarColumn(IsOnlyIgnoreInsert = true, IsNullable = true, Length=10)]
  14. //IsOnlyIgnoreInsert:插入操作不处理该列,IsNullable:允许为NULL,Length不指定默认为50
  15. public string Description2 { get; set; }
  16. [SugarColumn(IsOnlyIgnoreUpdate = true,ColumnDataType = "Nvarchar(256)")]
  17. //IsOnlyIgnoreUpdate:更新操作不处理该列,ColumnDataType/自定格式的情况,length不要设置
  18. public string Description3 { get; set; }
  19. }
  20. }

还可以自定义特性,更多参考连接
配置实体 - SqlSugar 5x - .NET果糖网 (donet5.com) 

Code First 代码优先,数据迁移 - SqlSugar 5x - .NET果糖网 (donet5.com) 

6. 实现数据库读写分离

总结:不要盲目使用读写分离 ,在考虑读写分离之前应该先考虑缓存 例如( redius)   和大数据表的水平切割

(1)首先SqlServer那里需要建立主库和分库,参考下面连接中的内容

SqlServer中配置读写分离_木白星枝的博客-CSDN博客

(2)需要重新配置ConnectionConfig

  1. public static void SetSeparation()
  2. {
  3. String connectionString = "Data Source=42.12.6.03,1433;Initial Catalog=d_test;User ID=sa;Password=48";
  4. List<SlaveConnectionConfig> slaveConnectionConfigs = new List<SlaveConnectionConfig>()
  5. {
  6. new SlaveConnectionConfig()
  7. {
  8. HitRate=10,
  9. ConnectionString="Data Source=42.12.6.03,1433;Initial Catalog=d1;User ID=sa;Password=48"
  10. },
  11. new SlaveConnectionConfig()
  12. {
  13. HitRate=10, //概率
  14. ConnectionString="Data Source=42.12.6.03,1433;Initial Catalog=d2;User ID=sa;Password=48"
  15. }
  16. };
  17. ConnectionConfig dbConfig =BuildConnConfig2(null, DbType.SqlServer, connectionString, slaveConnectionConfigs);
  18. }
  19. public static ConnectionConfig BuildConnConfig2(dynamic configId, DbType dbType, string connectionString,List<SlaveConnectionConfig> slaveConnectionConfigs)
  20. {
  21. return new ConnectionConfig()
  22. {
  23. ConfigId = configId, //可有可无,指定为1吧,不赋值也可以
  24. DbType = dbType, //数据库类型
  25. ConnectionString = connectionString,//主库的数据库连接
  26. SlaveConnectionConfigs=slaveConnectionConfigs,//从库的数据库连接
  27. IsAutoCloseConnection = true, //(默认false)是否自动释放数据库,设为true我们不需要close或者Using的操作,比较推荐
  28. MoreSettings = new ConnMoreSettings()
  29. {
  30. IsWithNoLockQuery = true//看这里 //true表示可以自动删除二级缓存
  31. },
  32. //InitKeyType = InitKeyType.Attribute,//默认就是这个,从实体特性中读取主键自增列信息,初始化主键和自增列信息到ORM的方式
  33. AopEvents = new AopEvents //调试SQL事件,可以删掉
  34. {
  35. OnLogExecuting = (sql, p) =>
  36. {
  37. p.ToDictionary(it => it.ParameterName, it => it.Value);
  38. System.Diagnostics.Trace.WriteLine(sql);
  39. System.Diagnostics.Trace.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value)));
  40. }
  41. }
  42. };
  43. }

(3)修改主库,从库会跟着改,修改从库,主库不变,修改主库后,数据同步到从库有延迟。

同步有延迟,要么业务允许延迟,要么直接查询主库

直接查询主库需要在查询前进行设置

  1. //主要是针对及时性要求比较高的
  2. db.Ado.IsDisableMasterSlaveSeparation = true; //直接基于主库进行查询

 应该监控文件更新,手动刷新不太好 

 6.实现分表

(1)分表使用场景

 <1>.NET可扩展架构设计,比如一个ERP用5年不卡,到了10年就卡了因为数据太多了,这个时候很多人都是备份然后清空数据

<2>.NET 数据量太多 ,每天都有几十上百万的数据进入库,如果不分表后面查询将会非常缓慢

<3>.NET性能瓶颈 ,数据库现有数据超过1个亿,很多情况下索引会莫名失效,性能大大下降

(2)内置分表使用

.NET 自带分表支持按年、按季、按月、按周、按日进行分表 

根据插入的数据自动分表,在数据库下自动创建分表,查询的时候不需要考虑具体几个分表。

 具体操作参看官网。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/134813
推荐阅读
相关标签
  

闽ICP备14008679号