我想部署一個使用EF5 codefist和遷移構建的MVC4應用程序。MigrateDatabaseToLatestVersion和dbo .__ MigrationHistory
我希望應用程序來更新數據庫,當我在將來部署新的遷移應用程序的新版本,所以在Global.asax中我這樣做:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<GoDealMvc4Context, Configuration>());
using (var ctx = new GoDealMvc4Context()) {
ctx.Database.Initialize(false);
}
服務器上的初始數據庫是通過附加從我的開發機器複製的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
因此很明顯,應用程序認爲它需要應用即使__MigrationHistory表存在於數據庫遷移此內容:
MigrationId Model ProductVersion
201210161046508_initial 0x1F8... 5.0.0.net45
和應用程序包含一個單一的遷移類:
201210161046508_initial.cs:
public partial class initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.UserProfile",
....
所以我的問題是: 1)爲什麼我的應用程序認爲它需要應用此遷移__MigrationsHistory表的內容是如所述。
2)這是建立一個應用程序的推薦方式,該應用程序會自動應用在新版本上重新啓動的新遷移。
踩在相同的耙子。如果要使用現有數據庫,則不應更改配置的名稱空間和類名稱。 –