次の方法で共有


SQL Server の値の生成

このページでは、SQL Server プロバイダーに固有の値生成の構成とパターンについて詳しく説明します。 最初に、値の生成に関する一般的なページ 読み取うことをお勧めします。

IDENTITY 列

規則により、追加時に値が生成されるように構成された数値列は、SQL Server IDENTITY 列 として設定されます。

シードとインクリメント

既定では、IDENTITY 列は 1 (シード) から開始され、行が追加されるたびに 1 ずつインクリメントされます (増分)。 別のシードを構成し、次のようにインクリメントできます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .UseIdentityColumn(seed: 10, increment: 10);
}

IDENTITY 列への明示的な値の挿入

既定では、SQL Server では、IDENTITY 列に明示的な値を挿入することはできません。 そのためには、次のように、SaveChangesAsync()を呼び出す前に手動で IDENTITY_INSERT を有効にする必要があります。

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();
    }
}

手記

SQL Server プロバイダー内でこれを自動的に行うために、機能要求 をバックログ に登録しています。

シーケンス

IDENTITY 列の代わりに、標準シーケンスを使用できます。 これは、さまざまなシナリオで役立ちます。たとえば、1 つのシーケンスから既定値を描画する複数の列が必要な場合があります。

SQL Server を使用すると、シーケンスを作成し、シーケンスの一般的なページ で詳しく説明されているように使用できます。 HasDefaultValueSql()を介してシーケンスを使用するようにプロパティを構成する必要があります。

GUID

GUID 主キーの場合、プロバイダーは、SQL Server の NEWSEQUENTIALID 関数と同様に、最適なシーケンシャル値を自動的に生成します。 クライアントでの値の生成は、一部のシナリオでより効率的です。つまり、データベース生成値を取得するために追加のデータベース ラウンド トリップが必要ない場合は、そのキーを参照する依存オブジェクトも挿入されます。

EF でキー以外のプロパティに対して同じシーケンシャル GUID 値を生成するには、次のように構成します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}

RowVersion

SQL Server には rowversion データ型があり、行が更新されるたびに自動的に変更されます。 これにより、同じ行が複数のトランザクションによって同時に更新されるケースを管理するために、コンカレンシー トークンとして非常に役立ちます。

コンカレンシー トークンとその使用方法を完全に理解するには、コンカレンシーの競合に関する専用ページを参照してください。 byte[] プロパティを rowversion 列にマップするには、次のように構成します。

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Timestamp]
    public byte[] Version { get; set; }
}