Generación de valores de SQL Server

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

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

De forma predeterminada, las columnas IDENTITY comienzan en 1 (la inicialización) e incrementan en 1 cada vez que se agrega una fila (el incremento). Puede configurar valores de inicialización e incremento diferentes de la siguiente forma:

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

Insertar 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 SaveChanges(), 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" });

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

Nota:

Tenemos una solicitud de característica en el trabajo pendiente para hacer esto de manera automática dentro del proveedor de SQL Server.

Secuencias

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

SQL Server permite crear secuencias y usarlas como se detalla en la página general sobre secuencias. De usted depende configurar las propiedades para usar secuencias a través de 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 otro recorrido de ida y vuelta a la base de datos para obtener el valor generado por la base de datos si 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 token de simultaneidad, para administrar casos en los que varias transacciones actualizan la misma fila a la vez.

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