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