EFEF Core Handbook

İ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 FORnextval('sequence_name')
  • Hi-Lo tam desteklenir
  • UseSerialColumn() legacy SERIAL; modern projelerde UseIdentityColumn() tercih et
  • Computed column: AS ... PERSISTED yok → GENERATED ALWAYS AS (...) STORED