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; }
}
.NET