Generowanie wartości programu SQL Server
Ta strona zawiera szczegóły konfiguracji generowania wartości i wzorców specyficznych dla dostawcy programu SQL Server. Zaleca się najpierw przeczytanie ogólnej strony o generowaniu wartości.
Kolumny IDENTITY
Zgodnie z konwencją kolumny liczbowe skonfigurowane pod kątem ich wartości wygenerowanych przy dodawaniu są konfigurowane jako kolumny TOŻSAMOŚCI programu SQL Server.
Wartość początkowa i inkrementacja
Domyślnie kolumny IDENTITY zaczynają się od 1 (punkt startowy) i zwiększają się o 1 za każdym razem, gdy wiersz jest dodawany (przyrost). Można skonfigurować inną wartość początkową i przyrost w następujący sposób:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Wstawianie jawnych wartości do kolumn IDENTITY
Domyślnie program SQL Server nie zezwala na wstawianie jawnych wartości do kolumn IDENTITY. W tym celu należy ręcznie włączyć IDENTITY_INSERT
przed wywołaniem SaveChangesAsync()
w następujący sposób:
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();
}
}
Notatka
Mamy żądanie funkcji na naszej liście prac, aby to zrobić automatycznie w ramach dostawcy programu SQL Server.
Sekwencje
Alternatywą dla kolumn IDENTITY jest użycie standardowych sekwencji. Może to być przydatne w różnych scenariuszach; na przykład możesz chcieć, aby wiele kolumn pobierało swoje wartości domyślne z jednej sekwencji.
Program SQL Server umożliwia tworzenie sekwencji i używanie ich zgodnie z opisem w stronie ogólnej na sekwencjach. To zależy od Ciebie, jak skonfigurujesz właściwości, aby używały sekwencji za pośrednictwem HasDefaultValueSql()
.
Identyfikatory GUID
W przypadku kluczy podstawowych GUID dostarczająca oprogramowanie automatycznie generuje wartości sekwencyjne optymalne, podobnie jak funkcja NEWSEQUENTIALID w programie SQL Server. Generowanie wartości na kliencie jest bardziej wydajne w niektórych scenariuszach, tj. nie jest potrzebne dodatkowe zapytanie do bazy danych, ponieważ jest również wstawiany element zależny, odwołujący się do tego klucza.
Aby program EF wygenerował te same wartości identyfikatora GUID sekwencyjnego dla właściwości innych niż klucz, skonfiguruj je w następujący sposób:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Rowversions
Program SQL Server ma typ danych rowversion
, który automatycznie zmienia się za każdym razem, gdy wiersz zostanie zaktualizowany. To sprawia, że jest to bardzo przydatne jako token współbieżności, w przypadku zarządzania przypadkami, w których ten sam wiersz jest jednocześnie aktualizowany przez wiele transakcji.
Aby w pełni zrozumieć tokeny współbieżności i ich zastosowanie, przeczytaj dedykowaną stronę o konfliktach współbieżności. Aby zamapować właściwość byte[]
na kolumnę rowversion
, skonfiguruj ją w następujący sposób:
- adnotacje danych
-
interfejsu API
Fluent
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}