Megosztás:


SQL Server értékgenerálás

Ez a lap az SQL Server-szolgáltatóra jellemző értékgenerálási konfigurációt és mintákat ismerteti. Javasoljuk, hogy először olvassa el az értékgenerálásról szóló általános oldalt.

IDENTITÁSoszlopok

Általában azok a numerikus oszlopok, amelyeket úgy konfigurálnak, hogy értékeik hozzáadáskor automatikusan generálódjanak, SQL Server IDENTITY-oszlopokkáválnak.

Mag és növekmény

Az IDENTITY-oszlopok alapértelmezés szerint 1-nél (a magnál) indulnak el, és minden sor hozzáadásakor 1-zel növekszik (a növekmény). Az alábbiak szerint konfigurálhat egy másik alapértéket és növekményt:

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

Explicit értékek beszúrása identitásoszlopokba

Alapértelmezés szerint az SQL Server nem engedélyezi explicit értékek beszúrását az IDENTITÁSoszlopokba. Ehhez manuálisan kell engedélyeznie a IDENTITY_INSERT, mielőtt meghívja SaveChangesAsync(), az alábbiak szerint:

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

Jegyzet

Van egy funkciókérésünk, a teendőnaplónkban, hogy ezt automatikusan elvégezzük az SQL Server-szolgáltatón belül.

Szekvenciák

Az IDENTITÁSoszlopok alternatívaként szabványos sorozatokat is használhat. Ez különböző helyzetekben lehet hasznos; Előfordulhat például, hogy több oszlop is egyetlen sorozatból rajzolja meg az alapértelmezett értékeket.

Az SQL Server lehetővé teszi a sorozatok létrehozását és használatát, ahogy az a sorozatok általános oldalán részletesen ismertetve van . Önön múlik, hogy a tulajdonságokat úgy konfigurálja, hogy sorrendeket használjon a HasDefaultValueSql()segítségével.

Guid

A GUID elsődleges kulcsok esetében a szolgáltató automatikusan optimális szekvenciális értékeket hoz létre, hasonlóan az SQL Server NEWSEQUENTIALID függvényéhez. Az érték generálása az ügyféloldalon bizonyos esetekben hatékonyabb, azaz nincs szükség újabb adatbázis-hozzáférésre az adatbázis által generált érték lekéréséhez, amikor egy kapcsolt rekordot is beillesztenek, ami erre a kulcsra hivatkozik.

Ha azt szeretné, hogy az EF ugyanazokat a szekvenciális GUID-értékeket hozza létre a nem kulcstulajdonságokhoz, konfigurálja őket az alábbiak szerint:

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

Rowversions

Az SQL Server rowversion adattípussal rendelkezik, amely a sor frissítésekor automatikusan megváltozik. Ez nagyon hasznos egyidejűségi tokenként az olyan esetek kezeléséhez, amikor ugyanazt a sort egyszerre több tranzakció is frissíti.

Az egyidejűségi jogkivonatok teljes megértéséhez és használatuk módjához olvassa el a dedikált oldalt egyidejűségi ütközésekről. Ha egy byte[] tulajdonságot egy rowversion oszlopra szeretne leképezni, konfigurálja az alábbiak szerint:

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

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