Generasi Nilai SQL Server
Halaman ini merinci konfigurasi dan pola pembuatan nilai yang khusus untuk penyedia SQL Server. Disarankan untuk terlebih dahulu membaca halaman umum tentang pembuatan nilai.
Kolom Identitas
Menurut konvensi, kolom numerik yang dikonfigurasi agar nilainya dihasilkan saat ditambahkan disiapkan sebagai kolom IDENTITAS SQL Server.
Nilai awal dan peningkatan
Secara default, kolom IDENTITY dimulai pada 1 (seed), dan kenaikan sebesar 1 setiap kali baris ditambahkan (kenaikan). Anda dapat mengonfigurasi nilai awal dan kenaikan yang berbeda sebagai berikut:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Menyisipkan nilai eksplisit ke dalam kolom IDENTITY
Secara default, SQL Server tidak mengizinkan menyisipkan nilai eksplisit ke dalam kolom IDENTITY. Untuk melakukannya, Anda harus mengaktifkan IDENTITY_INSERT
secara manual sebelum memanggil SaveChangesAsync()
, sebagai berikut:
using (var context = new ExplicitIdentityValuesContext())
{
context.Blogs.Add(new Blog { BlogId = 100, Url = "http://blog1.somesite.com" });
context.Blogs.Add(new Blog { BlogId = 101, Url = "http://blog2.somesite.com" });
await context.Database.OpenConnectionAsync();
try
{
await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs ON");
await context.SaveChangesAsync();
await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs OFF");
}
finally
{
await context.Database.CloseConnectionAsync();
}
}
Nota
Kami memiliki permintaan fitur dan di backlog kami untuk melakukan ini secara otomatis di dalam penyedia SQL Server.
Urutan
Sebagai alternatif untuk kolom IDENTITY, Anda dapat menggunakan urutan standar. Ini dapat berguna dalam berbagai skenario; misalnya, Anda mungkin ingin memiliki beberapa kolom yang menggambar nilai defaultnya dari satu urutan.
SQL Server memungkinkan Anda membuat urutan dan menggunakannya sebagaimana dirinci dalam halaman umum tentang urutan. Terserah Anda untuk mengonfigurasi properti Anda untuk menggunakan urutan melalui HasDefaultValueSql()
.
GUID (Pengidentifikasi Unik Global)
Untuk kunci primer GUID, penyedia secara otomatis menghasilkan nilai berurutan yang optimal, mirip dengan fungsi NEWSEQUENTIALID SQL Server. Menghasilkan nilai pada sisi klien lebih efisien dalam beberapa skenario, yaitu tidak diperlukan perjalanan tambahan ke database untuk mendapatkan nilai yang dihasilkan oleh database, ketika entitas bergantung juga dimasukkan yang merujuk pada kunci tersebut.
Agar EF menghasilkan nilai GUID berurutan yang sama untuk properti non-kunci, konfigurasikan sebagai berikut:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Rowversions
SQL Server memiliki tipe data rowversion
, yang secara otomatis berubah setiap kali baris diperbarui. Ini membuatnya sangat berguna sebagai token konkurensi, untuk mengelola kasus di mana baris yang sama secara bersamaan diperbarui oleh beberapa transaksi.
Untuk sepenuhnya memahami token konkurensi dan cara menggunakannya, baca halaman khusus tentang konflik konkurensi . Untuk memetakan properti byte[]
ke kolom rowversion
, konfigurasikan sebagai berikut:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}