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































فرم افزودن دیدگاه
با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.