Värdegenerering i SQL Server
Den här sidan beskriver konfiguration och mönster för värdegenerering som är specifika för SQL Server-providern. Vi rekommenderar att du först läser den allmänna sidan om värdegenerering.
IDENTITY-kolumner
Konventionellt konfigureras numeriska kolumner för att deras värden ska genereras vid tillägg som SQL Server IDENTITY-kolumner.
Frö och inkrement
Som standard börjar IDENTITY-kolumnerna vid 1 (startvärdet) och ökar med 1 varje gång en rad läggs till (inkrementet). Du kan konfigurera ett annat frö och öka enligt följande:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Infoga explicita värden i IDENTITY-kolumner
Sql Server tillåter som standard inte att explicita värden infogas i IDENTITY-kolumner. För att göra det måste du aktivera IDENTITY_INSERT
manuellt innan du anropar SaveChangesAsync()
, enligt följande:
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();
}
}
Not
Vi har en funktionsbegäran i vår backlog för att göra detta automatiskt inom SQL Server-leverantören.
Sekvenser
Som ett alternativ till IDENTITY-kolumner kan du använda standardsekvenser. Detta kan vara användbart i olika scenarier. Du kanske till exempel vill ha flera kolumner som ritar sina standardvärden från en enda sekvens.
Med SQL Server kan du skapa sekvenser och använda dem enligt beskrivningen i den allmänna sidan om sekvenser. Det är upp till dig att konfigurera dina egenskaper så att de använder sekvenser via HasDefaultValueSql()
.
Guid
För primära GUID-nycklar genererar providern automatiskt optimala sekventiella värden, ungefär som SQL Server-funktionen NEWSEQUENTIALID. Att generera värdet på klienten är mer effektivt i vissa scenarier, dvs. en extra databasrunda behövs inte för att hämta det databasgenererade värdet när en beroende post också infogas som refererar till nyckeln.
Om du vill att EF ska generera samma sekventiella GUID-värden för icke-nyckelegenskaper konfigurerar du dem på följande sätt:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Radversioner
SQL Server har rowversion
datatyp, som ändras automatiskt när raden uppdateras. Detta gör det mycket användbart som en samtidighetstoken för att hantera fall där samma rad uppdateras samtidigt av flera transaktioner.
Om du vill förstå samtidighetstoken och hur du använder dem kan du läsa den dedikerade sidan på samtidighetskonflikter. Om du vill mappa en byte[]
-egenskap till en rowversion
kolumn konfigurerar du den på följande sätt:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}