MigrateDatabaseToLatestVersion和dbo .__ MigrationHistory

Sti*_*son 4 entity-framework ef-code-first ef-migrations

我正在尝试部署使用EF5 codefist和迁移构建的MVC4应用程序.

我希望应用程序在将来部署具有新迁移的应用程序的新版本时更新数据库,因此在Global.asax中我这样做:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<GoDealMvc4Context, Configuration>());
using (var ctx = new GoDealMvc4Context()) {
    ctx.Database.Initialize(false);
}
Run Code Online (Sandbox Code Playgroud)

通过附加从我的开发机器复制的MDF文件来部署服务器上的初始数据库.此数据库包含__MigrationsHistory系统表.因此,此数据库不需要执行任何迁移,因为它是最新的迁移.

当我尝试在服务器上启动应用程序时,我收到此错误:

There is already an object named 'UserProfile' in the database.

[SqlException (0x80131904): There is already an object named 'UserProfile' in the database.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +388
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +688
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4403
System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) +2755286
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +527
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +290
System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) +247
System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) +202
System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) +472
System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) +175
System.Data.Entity.MigrateDatabaseToLatestVersion`2.InitializeDatabase(TContext context) +150
System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) +66
System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() +225
System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) +208
System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) +235
GoDeal.Mvc4.MvcApplication.Application_Start() +342
Run Code Online (Sandbox Code Playgroud)

所以显然应用程序认为它需要应用迁移,即使数据库中存在带有此内容的__MigrationHistory表:

MigrationId                 Model         ProductVersion
201210161046508_initial     0x1F8...      5.0.0.net45
Run Code Online (Sandbox Code Playgroud)

并且该应用程序包含一个迁移类:

201210161046508_initial.cs:

public partial class initial : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.UserProfile",
            ....
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:1)当__MigrationsHistory表的内容如上所述时,为什么我的应用程序认为需要应用此迁移.

2)这是制作应用程序的推荐方法,该应用程序自动应用新版本重新启动的新迁移.

phi*_*ady 8

对于寻找答案的人来说,这里还有另一个NASTY问题.检查内容

[dbo].[__MigrationHistory]   table    column ContextKey
Run Code Online (Sandbox Code Playgroud)

此表说明如何创建数据库(迁移模式,创建模式等...).和迁移配置程序.我通过更改MigrationsConfiguration类名来受伤.

更改表中的条目:-)或者重命名代码.