web-dev-qa-db-fra.com

Code d'abord pour Entity Framework: la migration échoue avec update-database, force add-migration (?) Non nécessaire

J'ai un effet amusant en utilisant la migration (EF 5.0) et le code en premier:

J'ai créé des modèles avec GUID clés primaires. (BTW: Il est important pour moi que SQL Server utilise NEWSEQUENTIALID(), ce qui semble être la valeur par défaut de la version actuelle)

À un moment donné, j'ai activé les migrations. J'ai ajouté du code à la migration initiale, il s'agit principalement de .Index() selon les besoins.

Lorsque je supprime la base de données et que j'appelle update-database, le message d'erreur suivant s'affiche:

Impossible de mettre à jour la base de données pour correspondre au modèle actuel car des modifications sont en attente et la migration automatique est désactivée. Écrivez les modifications de modèle en attente dans une migration basée sur un code ou activez la migration automatique. Définissez DbMigrationsConfiguration.AutomaticMigrationsEnabled sur true pour activer la migration automatique. Vous pouvez utiliser la commande Add-Migration pour écrire les modifications de modèle en attente dans une migration basée sur un code.

J'ai essayé AutomaticMigrationsEnabled = true, qui a fonctionné sans rien changer ni rien ajouter!

Mais comme je ne veux pas de AutomaticMigrationsEnabled, j’ai également essayé de supprimer à nouveau la base de données, appelée update-database puis add-migration. Je me suis retrouvé avec une migration supplémentaire qui semble ne rien changer (voir ci-dessous). J'ai également essayé d'ajouter ces lignes au bas de la migration initiale - mais cela ne change rien.

Un des modèles:

[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
    public const String TABLENAME = "Speaker";

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [Required]
    [MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
    public string Name { get; set; }
}

Le code de migration initial:

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        // [...]
        CreateTable(
            "dbo.Speaker",
            c => new
                {
                    Id = c.Guid(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 50),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Name, true, false);   // added manually: unique Name
        // [...]
    }
}

internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(MyProject.Repositories.DBContext context)
    {
        // ...
    }
}

Ci-dessous, le code créé par add-migration: Il ne semble rien faire de nouveau - peut-être qu'il me manque quelque chose?

public partial class UnneccessaryMigration : DbMigration
{
    public override void Up()
    {
        // isn't this the exact same code from InitialMigrations?
        AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
        // ...
    }

    public override void Down()
    {
        //...
        AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
    }
}

Je suis donc curieux: qu’ai-je fait pour désorienter les migrations? Et que puis-je faire pour que cela fonctionne avec une seule migration initiale?

Solution : La solution de contournement suivante l'a fait pour moi:

  1. J'ai supprimé la base de données et toutes les migrations comme décrit ici: https://stackoverflow.com/a/11679386/3168401
  2. Exécuté Enable-Migrations + Add-Migration Initial
  3. Fusion de mes modifications manuelles .Index () dans le fichier. Maintenant, Update-Database fonctionne à nouveau - également à plusieurs reprises, lors de la suppression de la base de données.
64
Its-me

J'ai également essayé à nouveau de supprimer la base de données, appelée update-database puis add-migration. Je me suis retrouvé avec une migration supplémentaire qui semble ne rien changer (voir ci-dessous)

Sur la base des détails ci-dessus, je pense que vous avez fait la dernière chose en premier. Si vous exécutez Update database avant Add-migration, la base de données ne sera pas mise à jour avec vos schémas de migration. Vous devez d’abord ajouter la migration, puis exécuter la commande update.

Essayez-les dans cet ordre en utilisant la console du gestionnaire de paquets.

PM> Enable-migrations //You don't need this as you have already done it
PM> Add-migration Give_it_a_name
PM> Update-database
99
Kaf

Entity Framework a quelques problèmes autour des champs d'identité.

Vous ne pouvez pas ajouter GUID identité sur une table existante

Migrations: ne détecte pas les modifications apportées à DatabaseGeneratedOption

Le reverse engineering ne marque pas les clés GUID avec NEWSEQUENTIALID () par défaut comme identités générées par le magasin

Aucune de celles-ci ne décrit votre problème avec précision et la méthode Down () de votre migration supplémentaire est intéressante, car elle semble tenter de supprimer IDENTITY de la colonne lorsque votre CREATE TABLE dans la migration initiale semble le définir!

De plus, si vous utilisez Update-Database -Script ou Update-Database -Verbose pour afficher le sql exécuté à partir de ces méthodes AlterColumn, vous verrez que celui-ci est identique dans Up et Down et ne fait rien. IDENTITY reste inchangé (pour la version actuelle - EF 6.0.2 et inférieure) - comme décrit dans les 2 premiers numéros auxquels j'ai lié.

Je pense que vous devriez supprimer le code redondant de votre migration supplémentaire et vivre avec une migration vide pour le moment. Et vous pouvez vous inscrire/voter pour les problèmes à traiter.

Références:

l'option Change IDENTITY ne s'accroupit pas

Activer/désactiver l'identité avec une opération de migration personnalisée

9
Colin

Essaye ça:

PM> Enable-migrations -force
PM> Add-migration MigrationName
PM> Update-database -force
2
Muhammad Awais

pour moi, je l'ai résolu comme suit: Dans Visual Studio 2015: dans le menu Affichage, cliquez sur Autres fenêtres, puis sur Console du gestionnaire de packages, puis exécutez les commandes suivantes:

PM> enable-migrations

Les migrations ont déjà été activées dans le projet 'mvcproject'. Pour écraser la configuration de migration existante, utilisez le paramètre -Force.

PM> enable-migrations -Force

Vérification si le contexte cible une base de données existante ... Migration de code d'abord activée pour le projet mvcproject.

puis ajoutez le nom de la migration dans le dossier de migration, il ajoutera la classe dont vous avez besoin dans l'Explorateur de solutions en exécutant la commande suivante

PM>Add-migration AddColumnUser

Enfin mettre à jour la base de données

PM> update-database 
1
Abdullah

Lorsque vous utilisez VS2019, MVC5 - recherchez le fichier Configuration.cs dans le dossier Migrations. Modifier: AutomaticMigrationsEnabled = true

    -
0
Sam Patirage