【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列

系列文章目录

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


文章目录

  • 系列文章目录
  • [一、前言 🍃](#一、前言 🍃)
  • [二、ORM中使用雪花ID ❄️](#二、ORM中使用雪花ID ❄️)
    • [2.1 普通插入](#2.1 普通插入)
    • [2.2 导航插入](#2.2 导航插入)
    • [2.3 手动调用雪花ID](#2.3 手动调用雪花ID)
  • [三、雪花ID重复 问题 🔁](#三、雪花ID重复 问题 🔁)
  • 四、Javascript精度问题
    • [4.1 方案1](#4.1 方案1)
    • [4.2 方案2](#4.2 方案2)
  • [五、自定义雪花ID算法 🎨](#五、自定义雪花ID算法 🎨)
  • [六、时间回退处理 🔙](#六、时间回退处理 🔙)
  • [🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀](#🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀)

一、前言 🍃

雪花算法 (Snowflake)是一种用于生成唯一标识符(ID)的分布式算法。它可以生成趋势递增且具有一定时间顺序的 64 位整数,适用于分布式系统中的唯一 ID 生成需求。下面将介绍雪花ID在 SqlSugar 中的用法。

二、ORM中使用雪花ID ❄️

2.1 普通插入

调用 ExecuteReturnSnowflakeId 方法主键会自动赋值雪花ID。

csharp 复制代码
public class 实体
{
   [SugarColumn(IsPrimaryKey =true)]//long类型的主键会自动赋值
   public long Id { get; set; }
   
   public string Name{get;set; }
}
long id= db.Insertable(实体).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
List<Long> ids=db.Insertable(List<实体>).ExecuteReturnSnowflakeIdList();//多条插入批量返回,比自增好用

2.2 导航插入

在导航操作中如果主键是 Long 不赋值也会自动赋值雪花ID。

2.3 手动调用雪花ID

csharp 复制代码
var id=SnowFlakeSingle.Instance.NextId();//也可以在程序中直接获取ID

三、雪花ID重复 问题 🔁

用雪花ID一定要设置 WorkId , 只要静态变量 SnowFlakeSingle 不能共享的情况都要有单独的WorkId

✅养成良好习惯服务器上的 WorkId 和本地不要一样,并且多服务器都要设置不一样的 WorkId

csharp 复制代码
//程序启时动执行一次就行
SnowFlakeSingle.WorkId= 唯一数字; //从配置文件读取一定要不一样
//服务器时间修改一定也要修改WorkId
 
//参数说明:
//workerId机器ID  2进制5位  32位减掉1位 31个
//datacenterId机房ID 2进制5位  32位减掉1位 31个

标注:SqlSugar自带雪花ID是成熟算法,正确配置WorkId无一例重复反馈,标题5也可以用自定义雪花算法。

四、Javascript精度问题

4.1 方案1

精度 long 没有19 位长度,所以序列化 雪花ID 时要序列化成 string

csharp 复制代码
[Newtonsoft.Json.JsonConverter(typeof(ValueToStringConverter))] //JsonConverter的命名空间不要搞错了
[SugarColumn(IsPrimaryKey =true)] 
 public long Id { get; set; }
   
//配置API使用JSON.NET
//Nuget安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
   services.AddControllers().AddNewtonsoftJson(opt =>
   {
                //忽略循环引用
                opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
   
                //不改变字段大小
                opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
    });

4.2 方案2

使用短雪花ID,这个算法需要你自已提供,因为短雪花ID不成熟所以我不提供,如何将自定义算法集成进SqlSugar看标题5。

五、自定义雪花ID算法 🎨

如果你有好用的雪花ID组件用习惯了也可以使用你自个的算法(用自已的算法WorkId等都需要你的算法自已支持)

csharp 复制代码
  //程序启动时执行一次就行
  StaticConfig.CustomSnowFlakeFunc = () =>
  {
      return 你的雪花ID方法();
  };

六、时间回退处理 🔙

系统因为临时故障引起的时间回退,一般就是几十毫秒,比如系统卡了等,可以用临时ID进行处理,不让程序报错,默认是扔出错误。

如果是人为调整就需要重启服务,不能长时间用自定义ID,或者修改 workId

csharp 复制代码
//程序启时动执行一次就行
var ran=new Random();
StaticConfig.CustomSnowFlakeTimeErrorFunc = () =>
 {
     return ran.Next(16, 18);//出现时间回退使用临时算法插入
 };

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

相关推荐
DataGear1 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
数据狐(DataFox)1 小时前
SQL参数化查询:防注入与计划缓存的双重优势
数据库·sql·缓存
专注VB编程开发20年3 小时前
C#,VB.NET从JSON数据里提取数组中的对象节点值
c#·json·.net
界面开发小八哥6 小时前
界面组件DevExpress WPF中文教程:Grid - 如何获取节点?
.net·wpf·界面控件·devexpress·ui开发
今晚打老虎z7 小时前
dotnet-env: .NET 开发者的环境变量加载工具
前端·chrome·.net
我是唐青枫8 小时前
C#.NET NLog 详解
开发语言·c#·.net
一线码农9 小时前
MinHook 如何对 .NET 母体 CoreCLR 进行拦截
c#·.net·代码注入
佛·追命10 小时前
.net wpf混淆
.net·wpf
编程乐趣11 小时前
自学C#,要懂得用好对象浏览器
windows·.net
先做个垃圾出来………12 小时前
SQL的底层逻辑解析
数据库·sql