Génération de valeur SQL Server

Cette page décrit les modèles et configuration de génération de valeur qui sont spécifiques au fournisseur SQL Server. Nous vous recommandons de lire en premier la page générale sur la génération de valeur.

Colonnes IDENTITY (IDENTITÉ)

Par convention, les colonnes numériques configurées pour avoir leurs valeurs générées sur Ajouter sont configurées en tant que colonnes IDENTITY SQL Server.

Valeur initiale et incrément

Par défaut, les colonnes IDENTITY commencent à 1 (la valeur initiale) et s’incrémentent de 1 lors de chaque ajout de ligne (l’incrément). Vous pouvez configurer une valeur initiale et un incrément différent comme ce qui 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 ne permet pas l’insertion de valeurs explicites dans des colonnes IDENTITY. Pour ce faire, vous devez activer manuellement IDENTITY_INSERT avant d’appeler SaveChanges() de la façon suivante :

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

Remarque

Nous avons une demande de fonctionnalité dans notre backlog pour faire cela automatiquement dans le fournisseur SQL Server.

Séquences

En tant qu’alternative aux colonnes IDENTITY, vous pouvez utiliser des séquences standard. Cette solution est utile dans divers scénarios, par exemple, il est possible que vous vouliez avoir plusieurs colonnes extrayant 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 détaillé dans la page générale sur les séquences. Il vous appartient de configurer vos propriétés pour utiliser des séquences via HasDefaultValueSql().

GUID

Pour des clés primaires GUID, le fournisseur génère automatiquement des valeurs séquentielles optimales, similaires à la fonction NEWSEQUENTIALID de SQL Server. Le fait de générer la valeur sur le client est plus efficace dans certains scénarios, par exemple un aller-retour de base de données supplémentaire n’est pas nécessaire pour obtenir la valeur générée par la base de données quand un dépendant est également inséré qui référence cette clé.

Pour qu’EF génère les mêmes valeurs GUID séquentielles pour des 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 se modifie automatiquement lorsque le rang est mis à jour. Cette opération est très utile comme jeton de concurrence pour gérer des cas dans lequel le même rang est simultanément mis à 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[] vers une colonne rowversion, configurez-la de la façon suivante :

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

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