Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatic Migrations for ASP.NET SimpleMembershipProvider

So I tried to use automatic migrations with my new MVC 4 Project but somehow it isn't working. I followed this blog post step by step.

I've added the changes to the UserProfile account model (the NotaryCode field):

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

Then I wrote on the package manager console enable-migrations and a Configuration class appeared (inherits from DbMigrationsConfiguration<Web.Models.UsersContext>) then I fill the class as:

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");      string 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" }); } 

And then I tried to run update-database -verbose but this doesn't work. I mean, this is the output:

There is already an object named 'UserProfile' in the 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(String methodName, Boolean async, Int32 timeout)    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String 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(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto)    at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)    at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String 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.** 

I know the object exists. I mean, I'm try to use automatic-migrations to, precisely, modify and run without recreating manually the DB. But somehow this isn't working.

I look the MSDN documentation and found the property:

AutomaticMigrationDataLossAllowed = true; 

But setting it to true doesn't change anything. I guess I'm missing something but somehow doesn't find what. Any idea?

like image 582
Erre Efe Avatar asked Nov 05 '12 18:11

Erre Efe


People also ask

How do I turn on automatic migrations in Entity Framework?

Open the Package Manager Console from Tools → Library Package Manager → Package Manager Console and then run the enable-migrations –EnableAutomaticMigration:$true command (make sure that the default project is the project where your context class is).

How can add-migration in ASP NET MVC?

Open the Package Manager Console. Select Tools > NuGet Package Manager > Package Manager Console. The Enable-Migration command creates the Migrations folder, which contains a script to initialize the database.

What are migrations used for asp net?

The Migrations feature enables you to change the data model and deploy your changes to production by updating the database schema without having to drop and re-create the database.


1 Answers

update-database -verbose doesn't work because your model has been changed after your data table already existed.

First, make sure there are no changes to the UserProfile class. Then, run:

Add-Migration InitialMigrations -IgnoreChanges

This should generate a blank "InitialMigration" file. Now, add any desired changes to the UserProfile class. Once changes are added, run the update command again:

update-database -verbose

Now the automatic migration will be applied and the table will be altered with your changes.

like image 178
HaMinh Nguyen Avatar answered Sep 24 '22 18:09

HaMinh Nguyen