Freigeben über


SQL Server-Wertgenerierung

Auf dieser Seite werden die Konfiguration und Muster der Wertgenerierung beschrieben, die für den SQL Server-Anbieter spezifisch sind. Es wird empfohlen, zuerst die allgemeine Seite zur Wertgenerierung zu lesen.

IDENTITY-Spalten

In der Konvention werden numerische Spalten, die so konfiguriert sind, dass ihre Werte beim Hinzufügen generiert werden, als SQL Server IDENTITY-Spalten eingerichtet.

Seed und Inkrement

Standardmäßig beginnen IDENTITY-Spalten bei 1 (dem Startwert) und werden jedes Mal um 1 erhöht, wenn eine Zeile hinzugefügt wird (das Inkrement). Sie können einen anderen Seed und ein anderes Inkrement wie folgt konfigurieren:

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

Einfügen von expliziten Werten in IDENTITY-Spalten

Standardmäßig lässt SQL Server das Einfügen expliziter Werte in IDENTITÄTsspalten nicht zu. Dazu müssen Sie IDENTITY_INSERT manuell aktivieren, bevor Sie SaveChangesAsync()aufrufen:

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

Anmerkung

Die Automatisierung dieses Vorgangs im SQL Server-Anbieter ist eine Featureanforderung, die sich im Backlog befindet.

Sequenzen

Als Alternative zu IDENTITÄTS-Spalten können Sie Standardsequenzen verwenden. Dies kann in verschiedenen Szenarien nützlich sein; zum Beispiel möchten Sie möglicherweise mehrere Spalten, deren Standardwerte aus einer einzelnen Sequenz abgeleitet werden.

SQL Server ermöglicht Ihnen das Erstellen von Sequenzen und deren Verwendung wie auf der allgemeinen Seite zu Sequenzen beschrieben. Es liegt an Ihnen, Ihre Eigenschaften so zu konfigurieren, dass Sequenzen über HasDefaultValueSql() verwendet werden.

GUIDs

Bei GUID-Primärschlüsseln generiert der Anbieter automatisch optimale sequenzielle Werte, ähnlich wie die NEWSEQUENTIALID--Funktion von SQL Server. Die Generierung des Wertes auf dem Client ist in einigen Szenarien effizienter, d. h. es ist kein zusätzlicher Datenbank-Roundtrip erforderlich, um den von der Datenbank generierten Wert zu erhalten, wenn auch eine abhängige Datei eingefügt wird, die auf diesen Schlüssel verweist.

Damit EF dieselben sequenziellen GUID-Werte für Nichtschlüsseleigenschaften generiert, konfigurieren Sie sie wie folgt:

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

Rowversions

SQL Server verfügt über den rowversion Datentyp, der bei jeder Aktualisierung der Zeile automatisch geändert wird. Dadurch ist es sehr nützlich als Parallelitätstoken, um Fälle zu verwalten, in denen dieselbe Zeile gleichzeitig von mehreren Transaktionen aktualisiert wird.

Um Parallelitätstoken und deren Verwendung vollständig zu verstehen, lesen Sie die dedizierte Seite zu Parallelitätskonflikten. Wenn Sie eine byte[] Eigenschaft einer rowversion Spalte zuordnen möchten, konfigurieren Sie sie wie folgt:

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

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