İLERİ
Sequence & Default Values
Sequence, veritabanı seviyesinde sıralı numara üreten bir nesne. Identity'den farkı: INSERT öncesinde numara alabilirsin (sipariş numarası gibi).
Veritabanı sağlayıcısı
Bu sayfadaki eşleşen örnekleri seçilen sağlayıcıya göre gösterir.
Sequence Tanımlama
// Sequence tanımlama
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000)
.IncrementsBy(1);
// Sequence kullanma
builder.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
// Hi-Lo pattern (toplu insert performansı)
builder.Property(p => p.Id).UseHiLo("ProductHiLo");
// Global Hi-Lo
modelBuilder.UseHiLo();
// Computed default
builder.Property(p => p.Slug)
.HasComputedColumnSql("LOWER(REPLACE([Name], ' ', '-'))", stored: true);
Sequence SQL:
CREATE SEQUENCE [shared].[OrderNumbers]
AS INT
START WITH 1000
INCREMENT BY 1;
-- Kullanımda:
SELECT NEXT VALUE FOR [shared].[OrderNumbers]; -- → 1000, 1001, 1002...
CREATE SEQUENCE shared.order_numbers
AS INT
START WITH 1000
INCREMENT BY 1;
-- Kullanımda:
SELECT nextval('shared.order_numbers'); -- → 1000, 1001, 1002...
-- Default olarak atama:
ALTER TABLE orders ALTER COLUMN order_no SET DEFAULT nextval('shared.order_numbers');
Hi-Lo pattern — nasıl çalışır
Uygulama başlangıcı:
DB'den blok al: 1-10 (Hi=10, Lo=1)
Insert 1: Id = 1 (DB'ye gitmeden)
Insert 2: Id = 2 (DB'ye gitmeden)
...
Insert 10: Id = 10 (blok bitti)
Yeni blok al: 11-20 (Hi=20, Lo=11)
Insert 11: Id = 11
...
Sequence & Default Values — Provider farkları
// Sequence kullanma
builder.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
// Hi-Lo pattern
builder.Property(p => p.Id).UseHiLo("ProductHiLo");
// Computed column (stored)
builder.Property(p => p.Slug)
.HasComputedColumnSql("LOWER(REPLACE([Name], ' ', '-'))", stored: true);
// Sequence kullanma
builder.Property(o => o.OrderNo)
.HasDefaultValueSql("nextval('shared.order_numbers')"); // PG syntax
// Hi-Lo pattern (aynı API, PG sequence kullanır)
builder.Property(p => p.Id).UseHiLo("product_hilo");
// Computed column (stored)
builder.Property(p => p.Slug)
.HasComputedColumnSql("LOWER(REPLACE(name, ' ', '-'))", stored: true);
// PG: GENERATED ALWAYS AS (lower(replace(name, ' ', '-'))) STORED
PostgreSQL notları:
NEXT VALUE FOR→nextval('sequence_name')- Hi-Lo tam desteklenir
UseSerialColumn()legacy SERIAL; modern projelerdeUseIdentityColumn()tercih et- Computed column:
AS ... PERSISTEDyok →GENERATED ALWAYS AS (...) STORED