Compartir a través de


Generación de valores de SQL Server

En esta página se detallan los patrones y la configuración de generación de valores específicos del proveedor de SQL Server. Se recomienda leer primero la página general sobre la generación de valor.

Columnas IDENTITY

Por convención, las columnas numéricas configuradas para que sus valores se generen en “add” se configuran como columnas IDENTITY de SQL Server.

Inicialización e incremento

Por defecto, las columnas IDENTITY comienzan en 1 (la semilla) y aumentan en 1 cada vez que se agrega una fila (el incremento). Puede configurar una semilla y un incremento diferentes como se indica a continuación:

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

Inserción de valores explícitos en columnas IDENTITY

De forma predeterminada, SQL Server no permite insertar valores explícitos en columnas IDENTITY. Para ello, debe habilitar manualmente IDENTITY_INSERT antes de llamar a SaveChangesAsync(), como se indica a continuación:

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

Nota

Tenemos una solicitud de función en nuestra lista de tareas pendientes para hacerlo automáticamente en el proveedor de SQL Server.

Secuencias

Como alternativa a las columnas IDENTITY, puede usar secuencias estándar. Esto puede ser útil en varios escenarios; por ejemplo, puede que quiera tener varias columnas dibujando sus valores predeterminados desde una sola secuencia.

SQL Server permite crear secuencias y usarlas como se detalla en la página general de secuencias. Depende de ti configurar tus propiedades para usar secuencias mediante HasDefaultValueSql().

GUID

En el caso de las claves principales GUID, el proveedor genera automáticamente valores secuenciales óptimos, de forma similar a la función NEWSEQUENTIALID de SQL Server. La generación del valor en el cliente es más eficaz en algunos escenarios, es decir, no se necesita un recorrido de ida y vuelta de base de datos adicional para obtener el valor generado por la base de datos, cuando también se inserta una dependencia que hace referencia a esa clave.

Para que EF genere los mismos valores GUID secuenciales para las propiedades que no son clave, configúrelos de la siguiente manera:

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

Rowversions

SQL Server tiene el tipo de datos rowversion, que cambia automáticamente cada vez que se actualiza la fila. Esto hace que sea muy útil como un token de simultaneidad, para administrar casos en los que varias transacciones actualizan simultáneamente la misma fila.

Para comprender totalmente los tokens de simultaneidad y cómo usarlos, lea la página dedicada sobre conflictos de simultaneidad. Para asignar una propiedad byte[] a una columna de rowversion, configúrela de la siguiente manera:

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

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