web-dev-qa-db-fra.com

EF Code First - Comment créer une graine d’identité?

J'ai une classe d'entité

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
}

J'ai défini le champ Id comme clé primaire avec génération automatique de numéros

modelBuilder.Entity<Employee>().HasKey(e => e.Id);
modelBuilder.Entity<Employee>().Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Mais je veux que l'identité commence à partir de 10 000 au lieu de 1, valeur par défaut. Comment puis-je spécifier cela dans EF?

29
Achinth Gurkhi

Si vous utilisez SQL Server, vous devez créer un initialiseur de base de données personnalisé et exécuter manuellement DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue). Pour créer et utiliser un initialiseur personnalisé avec des commandes SQL personnalisées, vérifiez cette réponse .

31
Ladislav Mrnka

Sur la base de la réponse de Ladislav Mrnka, vous pouvez ajouter ceci dans votre méthode de fichier de migration Up:

Sql("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
14
ehsan88

Vous pouvez sans aucun doute obtenir le même résultat que la valeur initiale 1000, en exécutant le script "DBCC CHECKIDENT (" TableName ", RESEED, NewSeedValue)" à partir de la méthode de script de migration Up.

Toutefois, la définition de la table dans SQL Server indique toujours "IDENTITY (1,1)" même si le premier enregistrement entré dans la table reçoit un identifiant 1000. Cela signifie que le germe d'identité de la table n'a pas été défini sur 1000. Les valeurs 999 initiales sont simplement consommées ou ignorées lors de la création du premier enregistrement, bien sûr parce que vous lancez la commande RESEED sur la base de données, c'est-à-dire que vous modifiez le SEED déjà défini.

Pour conclure, il semblerait que dans EF Core v2.1, Microsoft n’ait pas prévu de personnaliser la valeur d’origine de la graine d’identité lors de la création de la table. Espérons que les futures versions d'EF Core, probablement 2.2 ou 3.0, auront cette fonctionnalité. Thoughts ...?

0
Ankur Deshmukh

sur la base de @ ehsan88, vous pouvez créer une classe d'initialisation de base de données 

 public class AccDatabaseInitializer : CreateDatabaseIfNotExists<YourContect>
    {
      protected override void Seed(YourContect context)
       {
          context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
           context.SaveChanges();
       }
    }

merci 

0
kareem khalil