ASP.NET SimpleMembershipProvider自动迁移

所以我试图使用自动迁移与我的新MVC 4项目,但不知何故,它不工作。 我跟着这个博客文章一步一步。

我已将更改添加到UserProfile帐户模型( NotaryCode字段)中:

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

然后,我在包pipe理器控制台enable-migrations上写了一个Configuration类出现(从DbMigrationsConfiguration<Web.Models.UsersContext>inheritance),然后填充类:

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

然后我试图运行update-database -verbose但这不起作用。 我的意思是,这是输出:

数据库中已经有一个名为“UserProfile”的对象。

 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.** 

我知道这个物体存在。 我的意思是,我尝试使用自动迁移,准确地说,修改和运行,而无需手动重新创build数据库。 但不知何故,这是行不通的。

我看MSDN文档,并find属性:

 AutomaticMigrationDataLossAllowed = true; 

但将其设置为true不会改变任何内容。 我想我失去了一些东西,但不知何故没有find。 任何想法?

update-database -verbose不起作用,因为您的模型在数据表已经存在之后已经被更改。

首先,确保UserProfile类没有改变。 然后运行:

Add-Migration InitialMigrations -IgnoreChanges

这应该生成一个空白的“InitialMigration”文件。 现在,将所需的更改添加到UserProfile类。 一旦添加更改,再次运行更新命令:

update-database -verbose

现在自动迁移将被应用,表格将随您的更改而被更改。

看起来像在这里发生的是,您启用了迁移,然后运行该应用程序。 通过在使用UpdateDatabase命令之前运行该应用程序,EntityFramework将创build并填充数据库,但是由于启用迁移时数据库不存在,因此不会创buildInitialCreate迁移。 迁移仍然认为你有一个空的数据库,并希望在你的模型中创build所有的对象

您可以尝试的是重新启用迁移,这将生成反映数据库当前状态的InitialCreate迁移。 在这种情况下,我将保存对seed方法所做的更改,而不是运行“Enable-Migrations -Force”,这应该重新创build迁移并生成IntialCreate迁移。 然后,您可以重新填充种子方法并运行UpdateDatabase命令。

我有同样的,并以不同的方式sorting。 去我的本地db删除UserProfile和其他表具有外键约束webpages_Membership,webpages_OAuthMembership,webpages_Roles,webpages_UsersInRoles表。 所有这些将在您运行update-database -verbose时重新创build。