Génération de valeurs SQL Server
Cette page détaille la configuration et les modèles de génération de valeur spécifiques au fournisseur SQL Server. Il est recommandé de lire d’abord la page générale sur la génération de valeurs.
Colonnes IDENTITY
Par convention, les colonnes numériques configurées pour que leurs valeurs soient générées lors de l’ajout sont configurées comme colonnes SQL Server IDENTITY.
Valeur initiale et incrément
Par défaut, les colonnes IDENTITY démarrent à 1 (valeur initiale) et incrémentent de 1 chaque fois qu’une ligne est ajoutée (l’incrément). Vous pouvez configurer une graine et un incrément différents comme suit :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Insertion de valeurs explicites dans des colonnes IDENTITY
Par défaut, SQL Server n’autorise pas l’insertion de valeurs explicites dans les colonnes IDENTITY. Pour ce faire, vous devez activer manuellement IDENTITY_INSERT
avant d’appeler SaveChangesAsync()
, comme suit :
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();
}
}
Remarque
Nous avons une demande de fonctionnalité sur notre backlog pour effectuer cette opération automatiquement au sein du fournisseur SQL Server.
Séquences
En guise d’alternative aux colonnes IDENTITY, vous pouvez utiliser des séquences standard. Cela peut être utile dans différents scénarios ; par exemple, vous souhaiterez peut-être que plusieurs colonnes dessinent leurs valeurs par défaut à partir d’une seule séquence.
SQL Server vous permet de créer des séquences et de les utiliser comme indiqué dans la page générale des séquences. Il vous appartient de configurer vos propriétés pour utiliser des séquences via HasDefaultValueSql()
.
GUID
Pour les clés primaires GUID, le fournisseur génère automatiquement des valeurs séquentielles optimales, similaires à la fonction NEWSEQUENTIALID de SQL Server. Générer la valeur côté client est plus efficace dans certains cas, c'est-à-dire qu'un aller-retour supplémentaire à la base de données n'est pas nécessaire pour obtenir la valeur générée par celle-ci, lorsqu'une dépendance qui référence cette clé est également insérée.
Pour qu’EF génère les mêmes valeurs GUID séquentielles pour les propriétés non clés, configurez-les comme suit :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Rowversions
SQL Server a le type de données rowversion
, qui change automatiquement chaque fois que la ligne est mise à jour. Cela le rend très utile en tant que jeton de concurrence, pour gérer les cas où la même ligne est simultanément mise à jour par plusieurs transactions.
Pour comprendre pleinement les jetons de concurrence et la façon de les utiliser, lisez la page dédiée sur les conflits de concurrence. Pour mapper une propriété byte[]
à une colonne rowversion
, configurez-la comme suit :
- annotations de données
- API Fluent
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}