Sdílet prostřednictvím


Generování hodnot SQL Serveru

Tato stránka podrobně popisuje konfiguraci generování hodnot a vzory specifické pro poskytovatele SQL Serveru. Doporučujeme nejprve přečíst obecnou stránku o generování hodnot.

Sloupce IDENTITY

Podle konvence jsou číselné sloupce, které jsou nakonfigurované tak, aby se jejich hodnoty vygenerovaly při přidání, nastaveny jako sloupce IDENTITY SQL Serveru.

Počáteční a přírůstkové

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 jiné počáteční a přírůstky 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 SaveChanges()ručně povolit IDENTITY_INSERT následující:

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

Poznámka

V backlogu máme žádost o funkci, která to provede 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é nakreslily výchozí hodnoty z jedné sekvence.

SQL Server umožňuje vytvářet sekvence a používat je tak, jak je podrobně popsáno na stránce obecné na 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 poskytovatel automaticky generuje optimální sekvenční hodnoty podobné funkci NEWSEQUENTIALID SYSTÉMU SQL Server. Generování hodnoty v klientovi je efektivnější v některých scénářích, tj. k získání hodnoty vygenerované databáze není potřeba další doba odezvy databáze, pokud se na tento klíč vkládá také závislý odkaz.

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.

Pokud chcete plně porozumět tokenům souběžnosti a jejich používání, přečtěte si vyhrazenou stránku o konfliktech souběžnosti. Pokud chcete namapovat byte[] vlastnost na rowversion sloupec, nakonfigurujte ji následujícím způsobem:

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

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