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; }
}
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente las Cuestiones de GitHub como mecanismo de retroalimentación para el contenido y lo sustituiremos por un nuevo sistema de retroalimentación. Para más información, consulta:Enviar y ver comentarios de