Teilen über


SQL Server-Wertgenerierung

Diese Seite enthält Details zur Konfiguration der Wertegenerierung und zu den Mustern, die für den SQL Server-Anbieter spezifisch sind. Es wird empfohlen, zuerst die allgemeinen 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 IDENTITY-Spalten nicht zu. Dazu müssen Sie IDENTITY_INSERT manuell aktivieren, bevor Sie SaveChanges() aufrufen, und zwar wie folgt:

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

Hinweis

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

Sequenzen

Als Alternative zu IDENTITY-Spalten können Sie Standardsequenzen verwenden. Dies kann in verschiedenen Szenarien nützlich sein; zum Beispiel können Sie mehrere Spalten haben, die ihre Standardwerte aus einer einzigen Sequenz beziehen.

SQL Server ermöglicht ihnen das Erstellen von Sequenzen und deren Verwendung in der allgemeinen Seite auf Sequenzen. 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 Nicht-Schlüssel-Eigenschaften 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 sich automatisch ändert, wenn die Zeile aktualisiert wird. Dies macht 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 auf Parallelitätskonflikte. 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; }
}