web-dev-qa-db-fra.com

Modifiez la propriété IDENTITY d'une colonne, la colonne doit être supprimée et recréée

J'utilise EF Core 2.1

C'était ma définition initiale du modèle.

public class Customer //Parent
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public BankAccount BankAccount { get; set; }

}


public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public int CustomerId { get; set; }

    public Customer Customer { get; set; }

}

Mais j'ai réalisé que Id & CustomerId était à la fois une surcharge pour sa relation un-à-un, je peux mettre à jour ma définition de modèle BankAccount comme ci-dessous.

public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public Customer Customer { get; set; }

}

Alors que dans la classe DbContext défini l'entité principale comme ci-dessous.

HasOne(b => b.Customer).WithOne(c => c.BankAccount).HasForeignKey<BankAccount>(f => f.Id);

Lors de l'exécution de update-database J'obtiens l'erreur ci-dessous.

System.InvalidOperationException: pour modifier la propriété IDENTITY d'une colonne, la colonne doit être supprimée et recréée.

Cependant, idéalement, je ne devrais pas mais simplement me débarrasser de cette erreur, j'ai supprimé la colonne, les contraintes et la table ainsi que la base de données complète. Mais toujours la même erreur.

8
Kgn-web

J'ai rencontré le même problème et je l'ai résolu en deux étapes et deux migrations:

  1. Supprimez la colonne d'identité, commentez l'ID dans BankAccount et ajoutez-en une nouvelle, c'est-à-dire BankAccountId en tant qu'identité, ajoutez la migration et la mise à jour: celle-ci supprimera l'ID et ajoutera une nouvelle colonne en tant qu'identité.
  2. Supprimez la nouvelle colonne ajoutée et ajoutez à nouveau la précédente, commentez BankAccountId et dé-commentez l'ID, ajoutez la migration et la mise à jour: cela supprimera le BankAccountId et ajoutera l'ID comme idenity.
5
Hani

Cette erreur se produit lorsque vous essayez d'altérer ou de modifier une table qui existe déjà lorsque vous souhaitez modifier le schéma ou la table qui existe déjà, qu'EF core ne la prend pas encore en charge, elle nécessite une action manuelle. voici ce que vous pouvez faire à ce sujet:

  • Commentez le code associé dans le fichier de migration pour éviter cette erreur.
  • ou Supprimez les fichiers de migration et créez-en un nouveau.
  • Supprimez la migration en amont et laissez la migration générer un nouveau code.
2
Payam Khaninejad

J'ai rencontré ce problème lorsque j'ai essayé de changer un modèle de public byte Id {get; set;} à public int Id {get; set;}. Pour faire face au problème, j'ai fait les choses suivantes:

  1. Supprimez toutes les migrations jusqu'à la création du modèle cible avec Remove-Migration -Project <target_project> dans la console du gestionnaire de packages
  2. Supprimer la base de données réelle
  3. Si vous avez des migrations au milieu que vous n'avez pas créées (par exemple, elles proviennent d'une autre branche), copiez les fichiers de migrations ainsi que le fichier ModelSnapshot et collez-les dans votre branche (écrasez-les soigneusement!) .
  4. créer une nouvelle migration avec add-migration <migration_name> dans la console du gestionnaire de packages
  5. mettre à jour la base de données avec update-database dans la console du gestionnaire de packages

Je peux le résoudre de cette façon car mon code n'était pas dans un environnement de production. Vous devrez peut-être faire face à un autre problème complexe si le modèle est déjà là.

2
Tito Leiva

Je supprime le dossier Migrations et le _EFMigrationHistory table générée automatiquement. Ran Add-Migration MigrationName à nouveau sur Package Manager Console et Update-Database commande, le problème est résolu.

1
Auguste