0

J'essaie de mettre à jour la clé primaire de ma table pour qu'elle soit un entier auto-incrémenté Id.EF 6 Code First - Clé primaire d'entier - Impossible d'insérer la valeur NULL dans la colonne

Ceci est mon entité:

public class Reservation 
{ 
    public int Id { get; set; } 
    public ReservationStatus Status { get; set; } 
    public string Name { get; set; } 
    public string CustomerName { get; set; } 

    ... 
} 

C'est ma méthode OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     ... 

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

     ... 
    } 

C'est la migration générée:

public partial class Reservations_AlterKey_Id_AutoIncrement : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("dbo.Reservations"); 
     AlterColumn("dbo.Reservations", "Id", c => c.Int(nullable: false, identity: true)); 
     AlterColumn("dbo.Reservations", "CustomerTaxCode", c => c.String()); 
     AddPrimaryKey("dbo.Reservations", "Id"); 
    } 

    public override void Down() 
    { 
     DropPrimaryKey("dbo.Reservations"); 
     AlterColumn("dbo.Reservations", "CustomerTaxCode", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.Reservations", "Id", c => c.Int(nullable: false)); 
     AddPrimaryKey("dbo.Reservations", new[] { "Id", "DeviceId", "CustomerTaxCode" }); 
    } 
} 

Lorsque je tente d'insérer un nouvelle réservation (après Update-Database) l'exception suivante i s jeté:

Impossible d'insérer la valeur NULL dans la colonne 'Id', table 'xxxxx.dbo.Reservations';

C'est ce que je vois dans les propriétés de la colonne de concepteur (Visual Studio 2015):

enter image description here

"L'identité" est toujours faux.

Comment puis-je résoudre ce problème?

Merci à l'avance

+0

Avez-vous essayé d'ajouter ces attributs à la propriété 'Id' dans la classe' Reservation' au lieu de [couramment] (https://msdn.microsoft.com/fr-fr/data/jj591617.aspx) style: '[DataMember, Key, DatabaseGenerated (DatabaseGeneratedOption.Identity)]'. Avez-vous essayé de supprimer les tables pour forcer la récréation? –

+0

Oui, toujours la même chose. Je remarque que si je supprime toutes les migrations, recréer une seule migration et ensuite recréer la base de données Identity Specification est comme prévu. Je voudrais éviter de recréer la base de données car il y a déjà une version de production et je ne vais pas effacer toutes les données :(Toute suggestion? – Androidian

+0

Au lieu de surcharger OnModelCreation, essayez d'ajouter l'attribut [Key] à votre clé primaire et voyez si Cela va aider à réduire les problèmes possibles. – Licht

Répondre

4

Vous ne pouvez pas ajouter une identité à une colonne existante dans SQL Server.

Adding an identity to an existing column

solution suggérée est de créer une nouvelle colonne. La meilleure approche consiste à ajouter une nouvelle colonne d'identité, à créer une migration pour celle-ci, puis à supprimer l'ancienne colonne et à créer une migration pour cela. De cette façon EF ne va pas essayer de renommer l'ancienne colonne.