Entity Framework, appliquer les Migrations
J'utilise Entity Framework code first set AutomaticMigrationsEnabled vrai par ce code :
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DbContext, MigrateDBConfiguration>());
//////////////////////////////////
public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<DbContext>
{
public MigrateDBConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
Dans la première exécution le projet qu'il fonctionne bien et de créer une base de données et des tables. après j'ai changer de modèle et de supprimer certains de champ ou d'ajouter de nouveaux champs et exécutez l'assistant Ajout de Migration, la Migration de la classe générée, mais après l'exécution du projet cette exception se produire :
Une exception de type 'System.InvalidOperationException' s'est produite dans EntityFramework.dll mais n'a pas été traitée dans le code utilisateur
Informations supplémentaires: Le modèle de la sauvegarde de la "DBContext' a
changé depuis la base de données a été créé.
EDIT: Comme la réponse de arturo menchaca je peut changer de code comme ceci :
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBContext, MigrateDBConfiguration<DBContext>>());
...
Mais ths exception est ocure :
Il y a déjà un objet nommé "MyTable" dans la base de données.
Je veux appliquer mon migrations.
il semble que vous êtes en combinant les migrations automatiques avec manuel migations. Cela peut causer de sérieux migrationHistory questions dans la base de données (au moins autant que je l'ai vécu). Si vous générez manuel migrations essayez de désactiver les migrations automatiques.
OriginalL'auteur Fred | 2016-03-28
Vous devez vous connecter pour publier un commentaire.
Migrations automatiques signifie que vous n'avez pas besoin d'exécuter
add-migration
de commande pour que vos modifications dans les modèles, mais vous devez exécuterupdate-database
commande manuellement.Si Migrations Automatiques est activé lorsque vous appelez
update-database
, si il y a des modifications en attente dans vos modèles, un "automatique" de la migration et de la base de données sera mise à jour.Si vous voulez que votre base de données est mise à jour sans avoir besoin de faire appel
update-database
de commande, vous pouvez ajouterDatabase.SetInitializer(...)
dansOnModelCreating()
méthode de votre contexte, comme suit:Notez que vous devez déclarer
DbMigrationsConfiguration
etMigrateDatabaseToLatestVersion
avec votre contexte réel, et non pas la valeur par défautDbContext
.Je veux que ma base de données est mise à jour sans avoir besoin de faire appel de la mise à jour de la base de données et d'essayer votre solution et ne pas travailler.
Dans votre code, vous avez déclaré
MigrateDBConfiguration
commeDbMigrationsConfiguration<DbContext>
,DbContext
est le nom de votre contexte?, si c'est le cas, être conscient de ne pas confondre avec laSystem.Data.Entity.DbContext
mon DbContext nom de la classe est DbAccess, dans la question ci-dessus écrivez DbContext de la simplicité.
Et
Database.SetInitializer(...
est appelé dansOnModelCreating
ouDbAccess
constructeur?OriginalL'auteur Arturo Menchaca
J'ai enfin trouvé une solution à mon problème. J'appelle cette méthode à chaque démarrage de l'application :
migrator.Update();
au lieu d'obtenir le script et l'exécuter directementOriginalL'auteur Fred
Si vous avez des changements dans votre entités, vous devez d'abord exécuter
add-migration
pour créer le script de migration.Après que, dans votre
Global.asax
vous avez besoin d'avoir un peu de code comme ceci
chaque fois que vous exécutez votre asp.net projet, il va vérifier si vous avez une nouvelle migration pour courir et courir
update-database
automatiquement pour vous.OriginalL'auteur gorums