در بسیاری از پروژههای نرمافزاری، توسعهدهندگان به مقادیر عددی یکتا و افزایشی نیاز دارند؛ مثلاً برای شمارهگذاری سفارشها، فاکتورها یا تیکتهای پشتیبانی. در EF Core، Sequence ابزار قدرتمندی را فراهم میکند که این مقادیر را بهصورت کنترلشده تولید کند. Sequence بهعنوان یک شیء مستقل در پایگاهداده عمل میکند و میتواند بین چندین جدول مختلف به اشتراک گذاشته شود. در این آموزش با نحوه تعریف و استفاده از Sequence در EF Core آشنا میشویم و کاربردهای رایج آن را بررسی میکنیم.
با ما همراه باشید با آموزش Sequence در EF Core و Asp.Net Core
در توسعه نرمافزارهای حرفهای، گاهی نیاز است مقدار عددی یکتایی بهصورت افزایشی تولید شود که تحت کنترل توسعهدهنده باشد. در چنین مواردی، استفاده از Sequence در EF Core بهترین گزینه است. Sequence یک شیء در پایگاهداده است که وظیفه تولید اعداد افزایشی منحصربهفرد را بر عهده دارد. برخلاف Identity که فقط به یک ستون از یک جدول خاص وابسته است، Sequence یک عنصر مستقل از جدول بوده و میتواند توسط چندین جدول مختلف به اشتراک گذاشته شود.
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000)
.IncrementsBy(1)
.HasMin(1000)
.HasMax(99999)
.IsCyclic(false);
modelBuilder.Entity<Order>() .Property(o => o.OrderNo) .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
این روش زمانی کاربرد دارد، که بخواهید قبل از درج داده، مقدار Sequence را دریافت کنید.
var NextValue = _context.Database
.SqlQuery<long>($"SELECT NEXT VALUE FOR Shared.OrderSeq")
.AsEnumerable()
.First();
StartsAt فقط اولین مقدار تولیدی Sequence را تعیین میکند. اما HasMin یک محدودیت منطقی در پایگاهداده است که اجازه نمیدهد مقدار Sequence کمتر از آن شود (در مواقعی مثل وقتی Sequence cyclic باشد یا دستی مقداردهی شود).
در اکثر موارد StartsAt کافی است، اما برای Sequenceهایی که Cyclic هستند یا امنیت داده برای دامنه مشخص مهم است، بهتر است HasMin هم استفاده شود
فرض کن چند نوع موجودیت در سیستم وجود داره مثل: فاکتور خرید، فاکتور فروش، فاکتور برگشت، حالا اگر بخوای شماره فاکتور سراسری و یکتا باشه (مثلاً INV-1001, INV-1002, …) و در هیچکدوم تکرار نشه، باید همه از یک Sequence مشترک استفاده کنن.