我正在运行一个基于ASP.NET Core 2.1和EF Core 2.1的应用程序,它运行在Windows Server 2016上,使用SQL Server 2017 Web版。
在Startup.cs
文件中的public void Configure(IApplicationBuilder app, ...
方法的结尾处,我调用了context.Database.Migrate();
来应用迁移。一切工作正常。
现在,在我的开发环境中备份数据库,在SQL Server 2016上将MyDatabaseName
.bak
文件移动到服务器上并还原数据库MyDatabaseName
,然后重新启动IIS站点。
当我启动应用程序(打开浏览器)时,我会得到以下错误:
Application startup exception: System.Data.SqlClient.SqlException (0x80131904): Database 'MyDatabaseName' already exists. Choose a different database name.
出错的位置是:context.Database.Migrate();
。
完整的错误信息在底部。
如果我将MyDatabaseName
更改为不存在的MyDatabaseNameX
,则将创建数据库,应用所有迁移,我可以重置IIS,启动应用程序。但是,如果我还原数据库,则会出现“已存在”的错误。
同一应用程序(完全相同的dll)在开发和生产环境中运行。这也意味着数据库结构是相同的。
我需要在生产环境中还原数据库。我只是不确定为什么context.Database.Migrate()
会抛出错误?
完整的错误信息:
应用程序启动异常:System.Data.SqlClient.SqlException (0x80131904):数据库'MyDatabaseName'已经存在。选择一个不同的数据库名称。 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 中
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) 中
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 中
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 中
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 中
在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName) 中
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 中
在 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary
2 parameterValues) 中
在 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) 中
在 Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary
2 parameterValues) 中
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection) 中
在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Create() 中
在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration) 中
在 Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade) 中
在 MyProject.Startup.Configure(IApplicationBuilder app, AppUserManager userManager, IServiceProvider serviceProvider) 中,位于 C:\GitLab-Runner\builds\7cab42e4\0\web\MyProject\Startup.cs 的第582行
--- 前一个位置跟踪到异常被抛出的位置 ---
在 Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app) 中
在 Microsoft.AspNetCore.Server.IISIntegration.IISSetupFilter.<>c__DisplayClass4_0.b__0(IApplicationBuilder app) 中
在 Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder builder) 中
在 Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication() 中
客户端连接 ID: 7f6b84a3-e0ea-42c7-947d-a9cafdaffbfa 错误号码: 1801,状态: 3,类别: 16
托管环境: 生产
内容根路径: C:\WWW\MyProject
现在正在侦听: http://127.0.0.1:24830
应用程序已启动。按Ctrl+C关闭。应用程序正在关闭...
context.Database.Migrate();
创建数据库。 - Vivek NunaMyDatabaseNameX
然后重新启动 IIS,为什么它会运行正常?当我运行应用程序时,它应该产生相同的错误,但它并没有。只有在使用还原时才会发生错误。在我开发时,每次调试都会进行此调用,但不会引发任何错误。 - Makla__efmigrationhistory
表,然后再尝试吗? - Vivek Nuna