web-dev-qa-db-fra.com

Update-Database tente d'effectuer une migration automatique, même si la migration automatique est désactivée.

Je travaille sur une équipe de 4 développeurs utilisant EF5, chacun travaillant sur sa propre base de données locale. Jusqu'à présent, nous utilisions des migrations automatiques, mais nous sommes sur le point de passer à la production. Nous avons donc désactivé les migrations automatiques et commencé à ajouter des migrations explicites basées sur du code.

Voici le problème: j'ai exécuté la commande Update-Database après qu'un développeur ait créé une nouvelle migration explicite et j'obtiens le message d'erreur suivant:

Applying code-based migrations: [201209080142319_CreatedDate.LastModifiedDate.Additions].
Applying code-based migration: 201209080142319_CreatedDate.LastModifiedDate.Additions.
Applying automatic migration:    201209080142319_CreatedDate.LastModifiedDate.Additions_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.

Pourquoi ai-je cette erreur alors que j'ai désactivé les migrations automatiques? Je peux corriger cette erreur en supprimant la migration explicite, puis en la rééchafaudant (en exécutant Add-Migration). Alors Update-Database fonctionne bien et ne mentionne rien au sujet de la « migration automatique ... » En outre, le code dans la migration créé par moi quand je lance Add-migration est identique à celui créé par mon coéquipier. Je ne vois pas pourquoi il essaierait même de faire une migration automatique depuis AutomaticMigrationsEnabled = false;.

Qu'est-ce que j'oublie ici?

16
Dave Graves

Je déteste répondre à ma propre question, mais j'ai à nouveau rencontré ce problème. Un développeur de mon équipe a réactivé les migrations automatiques sur leur ordinateur local, puis a créé une migration explicite, qui reproduit ce problème dès que je l'ai exécuté.

Entity Framework exécute toujours une migration automatique avant d’exécuter une migration explicite dont la propriété Source est définie dans son fichier .resx, même si AutomaticMigrationsEnabled = false. La propriété Source ne sera définie dans une migration explicite que si elle est créée après l'exécution d'une migration automatique.

Le résultat est que la désactivation des migrations automatiques signifie uniquement que EF ne mettra pas automatiquement à jour votre schéma lorsqu'il détectera les modifications de modèle - mais il peut toujours effectuer une migration automatique s'il doit combler un vide entre certaines migrations explicites. Pour éviter ce problème, n'utilisez pas un mélange de migrations automatiques et de migrations explicites.

24
Dave Graves
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }

Ajoutez AutomaticMigrationDataLossAllowed = true; afin de supposer que vous souhaitez autoriser EF à ajouter des objets de suppression SQL entraînant une perte de données.

4
user761172

AutomaticMigrationEnabled = false empêche votre application de mettre à jour la base de données par elle-même.

Mais puisque vous exécutez vous-même Update-database, Update-Database vérifie l’état actuel de la base de données, puis exécute toutes les étapes de migration qui ne se trouvent pas déjà dans la base de données, y compris les modifications apportées au modèle (dbContext) qui n’ont pas encore de migration basée sur code. .

Mon hypothèse est qu'il y a un changement dans le modèle qui provoquerait une perte de données.

Vous pouvez utiliser le paramètre -force pour appliquer les modifications en cas de perte de données.

0
jjslagace

Mon équipe a vécu quelque chose qui pourrait être lié à cela. Si deux membres de l'équipe ajoutent tous deux une migration, archivent leur code, obtiennent le code le plus récent, puis effectuent une mise à jour de la base de données. Le second obtiendra une erreur car une migration est "ignorée" - leur système voit que la migration du membre de l'équipe n'a jamais été mise en œuvre. .

Nous avons commencé à tout contrôler et à obtenir les dernières informations, en effectuant la mise à jour-base de données (si un membre de l'équipe ajoutait une nouvelle migration), puis en effectuant add-migration, update-database, archivage.

0
Rusty Divine