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 資料行。 若要這樣做,您必須在呼叫 SaveChanges()
之前手動啟用 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" });
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();
}
}
注意
在我們的待辦項目上有一個在 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; }
}