Migrations automatiques pour ASP.NET SimpleMembershipProvider

J’ai donc essayé d’utiliser les migrations automatiques avec mon nouveau projet MVC 4, mais cela ne fonctionne pas. J’ai suivi ce blog pas à pas.

J’ai ajouté les modifications au modèle de compte UserProfile (le champ NotaryCode ):

 [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public ssortingng UserName { get; set; } public int NotaryCode { get; set; } } 

Ensuite, j’ai écrit sur la console du gestionnaire de paquets enable-migrations et une classe de configuration est apparue (hérite de DbMigrationsConfiguration ) puis je remplis la classe comme DbMigrationsConfiguration :

 public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(Atomic.Vesper.Cloud.Web.Models.UsersContext context) { WebSecurity.InitializeDatabaseConnection( "DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); if (!Roles.RoleExists("Atomic")) Roles.CreateRole("Atomic"); if (!Roles.RoleExists("Protocolista")) Roles.CreateRole("Protocolista"); if (!Roles.RoleExists("Cliente")) Roles.CreateRole("Cliente"); ssortingng adminUser = "randolf"; if (!WebSecurity.UserExists(adminUser)) WebSecurity.CreateUserAndAccount( adminUser, "12345", new { NotaryCode = -1 }); if (!Roles.GetRolesForUser(adminUser).Contains("Atomic")) Roles.AddUsersToRoles(new[] { adminUser }, new[] { "Atomic" }); } 

Et puis j’ai essayé de lancer update-database -verbose mais cela ne fonctionne pas. Je veux dire, c’est la sortie:

Il existe déjà un object nommé ‘UserProfile’ dans la firebase database.

 PM> update-database -verbose Using StartUp project 'Web'. Using NuGet project 'Web'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'VesperCloud' (DataSource: .\SQLSERVER, Provider: System.Data.SqlClient, Origin: Configuration). No pending code-based migrations. Applying automatic migration: 201211051825098_AutomaticMigration. CREATE TABLE [dbo].[UserProfile] ( [UserId] [int] NOT NULL IDENTITY, [UserName] [nvarchar](max), [NotaryCode] [int] NOT NULL, CONSTRAINT [PK_dbo.UserProfile] PRIMARY KEY ([UserId]) ) System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'UserProfile' in the database. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(Ssortingng methodName, Boolean async, Int32 timeout) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Ssortingng methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(Ssortingng migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(Ssortingng migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(Ssortingng migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, Ssortingng targetMigrationId, Ssortingng lastMigrationId) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, Ssortingng targetMigrationId, Ssortingng lastMigrationId) at System.Data.Entity.Migrations.DbMigrator.Update(Ssortingng targetMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(Ssortingng targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId:a7da0ddb-bccf-490f-bc1e-ecd2eb4eab04 **There is already an object named 'UserProfile' in the database.** 

Je sais que l’object existe. Je veux dire, je tente d’utiliser les migrations automatiques pour modifier, exécuter, précisément, sans recréer manuellement la firebase database. Mais de toute façon, cela ne fonctionne pas.

Je regarde la documentation MSDN et a trouvé la propriété:

 AutomaticMigrationDataLossAllowed = true; 

Mais le mettre à true ne change rien. Je suppose que je manque quelque chose mais ne trouve pas quoi que ce soit. Une idée?

update-database -verbose ne fonctionne pas car votre modèle a été modifié après que votre tableau de données existait déjà.

Tout d’abord, assurez-vous qu’il n’y a aucun changement dans la classe UserProfile. Ensuite, lancez:

Add-Migration InitialMigrations -IgnoreChanges

Cela devrait générer un fichier vierge “InitialMigration”. Ajoutez maintenant les modifications souhaitées à la classe UserProfile. Une fois les modifications ajoutées, exécutez à nouveau la commande update:

update-database -verbose

Maintenant, la migration automatique sera appliquée et la table sera modifiée avec vos modifications.

Ce à quoi cela ressemble, c’est que vous avez activé les migrations, puis exécuté l’application. En exécutant l’application avant d’utiliser la commande UpdateDatabase, EntityFramework aurait créé et rempli la firebase database, mais depuis que vous avez activé les migrations, la firebase database n’existait pas, elle n’a pas créé la migration InitialCreate. Migrations pense toujours que vous avez une firebase database vide et que vous souhaitez créer tous les objects de votre modèle.

Ce que vous pouvez essayer est soit de réactiver les migrations qui généreront une migration InitialCreate qui reflète l’état actuel de la firebase database. Dans ce cas, je voudrais enregistrer les modifications que vous avez apscopes à la méthode d’amorçage plutôt que d’exécuter “Activer-Migrations-Force”, cela devrait recréer la migration et générer une migration IntialCreate. Vous pouvez ensuite repeupler votre méthode d’amorçage et exécuter la commande UpdateDatabase.

J’avais le même et sortingé de manière différente. A ma firebase database locale, j’ai supprimé le profil utilisateur et les autres tables ayant des contraintes de clé étrangère webpages_Membership, webpages_OAuthMembership, webpages_Roles, tables webpages_UsersInRoles. Tous ces éléments seront recréés lorsque vous exécuterez update-database -verbose.