Bagikan melalui


Pembuatan 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 IDENTITY

Menurut konvensi, kolom numerik yang dikonfigurasi agar nilainya dihasilkan saat ditambahkan disiapkan sebagai kolom IDENTITAS SQL Server.

Benih dan kenaikan

Secara default, kolom IDENTITY dimulai pada 1 (seed), dan kenaikan sebesar 1 setiap kali baris ditambahkan (kenaikan). Anda dapat mengonfigurasi benih 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 SaveChanges(), 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" });

    context.Database.OpenConnection();
    try
    {
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs ON");
        context.SaveChanges();
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs OFF");
    }
    finally
    {
        context.Database.CloseConnection();
    }
}

Catatan

Kami memiliki permintaan fitur di backlog kami untuk melakukan ini secara otomatis 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 di halaman umum pada urutan. Terserah Anda untuk mengonfigurasi properti Anda untuk menggunakan urutan melalui HasDefaultValueSql().

GUID

Untuk kunci utama GUID, penyedia secara otomatis menghasilkan nilai berurutan yang optimal, mirip dengan fungsi NEWSEQUENTIALID SQL Server. Menghasilkan nilai pada klien lebih efisien dalam beberapa skenario, yaitu perjalanan pulang pergi database tambahan tidak diperlukan untuk mendapatkan nilai yang dihasilkan database, ketika dependen juga dimasukkan yang mereferensikan 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 rowversion tipe data, 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 byte[] properti ke rowversion kolom, 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; }
}