EF中创建、使用Oracle数据库的Sequence(序列)功能
** 背景 **
项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当前订单数。
每天的订单数都是从0开始的,每生成一个订单,订单数就应该加1.订单数应该是持久的,写在Session中或者Memcached缓存中,当网站重启或者服务器重启时都会面临丢失的问题,所以只能存在数据库中。幸好Oracle数据库提供了Sequence(序列)功能,我们来看下Sequence(序列)的概述及其用法。
** 概述 **
Oracle提供了Sequence对象,由系统提供自增长的序列号,通常用于生成数据库的自增长主键或序号的地方。
Sequence是数据库系统按照一定规则自动增加的数字序列。这个序列一般作为代理主键(因为不会重复),没有其他任何意义。1
** 基本用法 **
CREATE SEQUENCE emp_sequence -序列名
INCREMENT BY 1 — 每次递增数值
START WITH 1 — 从1开始计数
MAXVALUE 999999 --最大值 || NOMAXVALUE — 不设置最大值
CYCLE - 循环,达到最大值从最小值开始||NOCYCLE — 一直累加,不循环
CACHE 10;-缓存数值
下面我们就来看EF的DbContext具体使用:
** 1. 判断是否存在名为ODORDER
的序列 **
int count = context.Database.SqlQuery<int>("SELECT count(*) FROM All_Sequences where Sequence_name='ODORDER'").FirstOrDefault()
如数据库中存在该序列,则返回的数值应大于0。
** 2. 每天的订单数都应该是从新开始的,所以简单做法如果存在ODORDER
该序列,我们先删除. **
context.Database.ExecuteSqlCommand("DROP SEQUENCE ODORDER")
** 3. 创建名为ODORDER
的序列 **
context.Database.ExecuteSqlCommand("CREATE SEQUENCE ODORDER INCREMENT BY 1 START WITH 100000 MAXVALUE 900000 MINVALUE 100000 CYCLE CACHE 20 ");
** 4. 获取最新订单数 **
context.Database.SqlQuery<int>("select ODORDER.nextval from dual").FirstOrDefault()
原创文章,如有转摘请注明来源!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构