Dela via


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