Generování hodnot SQL Serveru
Tato stránka podrobně popisuje konfiguraci generování hodnot a vzory specifické pro poskytovatele SQL Serveru. Doporučuje se nejprve přečíst si obecnou stránku o generování hodnot.
Sloupce IDENTITY
Podle konvence jsou číselné sloupce, které jsou nakonfigurované tak, aby měly hodnoty generované při přidávání, nastaveny jako sloupce IDENTITY SQL Serveru.
Počáteční hodnota a přírůstek
Ve výchozím nastavení začínají sloupce IDENTITY od 1 (počáteční hodnoty) a při každém přidání řádku (přírůstku) se zvýší o 1. Můžete nakonfigurovat jinou výchozí hodnotu a přírůstek následujícím způsobem:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Vložení explicitních hodnot do sloupců IDENTITY
SQL Server ve výchozím nastavení neumožňuje vkládání explicitních hodnot do sloupců IDENTITY. Chcete-li to provést, musíte před voláním SaveChangesAsync()
ručně povolit IDENTITY_INSERT
následujícím způsobem:
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();
}
}
Poznámka
Máme žádost o funkci v backlogu, abychom to mohli provést automaticky v rámci poskytovatele SQL Serveru.
Sekvence
Jako alternativu ke sloupcům IDENTITY můžete použít standardní sekvence. To může být užitečné v různých scénářích; můžete například chtít mít více sloupců, které čerpají výchozí hodnoty z jedné sekvence.
SQL Server umožňuje vytvářet sekvence a používat je tak, jak je podrobně uvedeno v obecné stránce o sekvencích. Je na vás, abyste své vlastnosti nakonfigurovali tak, aby používaly sekvence prostřednictvím HasDefaultValueSql()
.
Guid
U primárních klíčů GUID zprostředkovatel automaticky generuje optimální sekvenční hodnoty, podobně jako funkce NEWSEQUENTIALID systému SQL Server. Generování hodnoty na straně klienta je efektivnější v některých scénářích, tj. k získání hodnoty generované databází není potřeba další požadavek do databáze, pokud je také vkládán záznam, který na tento klíč odkazuje.
Pokud chcete, aby ef vygeneroval stejné sekvenční hodnoty GUID pro vlastnosti bez klíče, nakonfigurujte je následujícím způsobem:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Verze řádků
SQL Server má rowversion
datový typ, který se automaticky změní při každé aktualizaci řádku. Díky tomu je velmi užitečný jako token souběžnosti pro správu případů, kdy je stejný řádek současně aktualizován více transakcemi.
Pro plné pochopení tokenů souběžnosti a jejich použití si přečtěte specializovanou stránku o konfliktech souběžnosti. Pokud chcete mapovat vlastnost byte[]
na sloupec rowversion
, nakonfigurujte ji následujícím způsobem:
- Datové anotace
-
rozhraní FLUENT API
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}