Delen via


SQL Server-waardegeneratie

Op deze pagina vindt u informatie over de configuratie en patronen voor het genereren van waarden die specifiek zijn voor de SQL Server-provider. Het is raadzaam om eerst de algemene pagina over het genereren van waardente lezen.

Identiteitskolommen

Volgens conventie worden numerieke kolommen die zijn geconfigureerd om de waarden te genereren bij toevoeging, ingesteld als SQL Server IDENTITY-kolommen.

Beginwaarde en verhoging

Identiteitskolommen beginnen standaard bij 1 (het begingetal) en worden telkens met 1 verhoogd wanneer een rij wordt toegevoegd (het increment). U kunt als volgt een andere seed en increment configureren:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .UseIdentityColumn(seed: 10, increment: 10);
}

Expliciete waarden invoegen in IDENTITEITSkolommen

Standaard staat SQL Server het invoegen van expliciete waarden in IDENTITEITSkolommen niet toe. Hiervoor moet u IDENTITY_INSERT handmatig inschakelen voordat u SaveChangesAsync()aanroept, als volgt:

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

Notitie

We hebben een functieverzoek op onze takenlijst om dit automatisch binnen de SQL Server-provider te doen.

Sequenties

Als alternatief voor IDENTITY-kolommen kunt u standaardreeksen gebruiken. Dit kan handig zijn in verschillende scenario's; U wilt bijvoorbeeld meerdere kolommen hebben die hun standaardwaarden uit één reeks tekenen.

Met SQL Server kunt u reeksen maken en gebruiken zoals beschreven in de algemene pagina op reeksen. Het is aan u om uw eigenschappen te configureren voor het gebruik van reeksen via HasDefaultValueSql().

GUIDs

Voor primaire GUID-sleutels genereert de provider automatisch optimale sequentiële waarden, vergelijkbaar met de functie NEWSEQUENTIALID van SQL Server. Het genereren van de waarde op de client is in sommige scenario's efficiënter, d.w.z. een extra ronde naar de database is niet nodig om de door de database gegenereerde waarde op te halen, wanneer er ook een afhankelijk record wordt ingevoegd dat naar die sleutel verwijst.

Als u wilt dat EF dezelfde sequentiële GUID-waarden genereert voor niet-sleuteleigenschappen, configureert u deze als volgt:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}

Rowversions

SQL Server heeft het rowversion gegevenstype, dat automatisch wordt gewijzigd wanneer de rij wordt bijgewerkt. Dit maakt het zeer nuttig als een gelijktijdigheidstoken, voor het beheren van gevallen waarin dezelfde rij tegelijkertijd wordt bijgewerkt door meerdere transacties.

Lees de speciale pagina over gelijktijdigheidsconflictenvoor een volledig begrip van gelijktijdigheidstokens en hun gebruik. Als u een byte[] eigenschap wilt toewijzen aan een rowversion kolom, configureert u deze als volgt:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Timestamp]
    public byte[] Version { get; set; }
}