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 欄位的替代方案,您可以使用標準序列。 這在各種案例中很有用;例如,您可能想要讓多個資料行從單一序列繪製其預設值。
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));
}
Rowversions
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; }
}