【发布时间】:2018-06-22 05:08:31
【问题描述】:
我在带有 SQL Server 2017 Web 版的 Windows Server 2016 上运行带有 EF Core 2.1 应用程序的 ASP.NET Core 2.1。
在Startup.cs 中的public void Configure(IApplicationBuilder app, ... 方法结束时,我调用context.Database.Migrate();。这适用于迁移。
一切正常。
现在我在 SQL Server 2016 的开发环境中备份数据库,将 MyDatabaseName .bak 文件移动到服务器并在服务器上恢复数据库 MyDatabaseName 并重新启动 IIS 站点。
当我启动应用程序(打开浏览器)时,出现以下错误:
应用程序启动异常:System.Data.SqlClient.SqlException (0x80131904): 数据库 'MyDatabaseName' 已经存在。选择一个 不同的数据库名称。
在线:context.Database.Migrate();。
完整的错误在底部。
如果我将MyDatabaseName 更改为MyDatabaseNameX(不存在),则创建数据库,应用所有迁移,我可以重置 IIS,启动应用程序。如果我恢复数据库,我会收到错误already exists。
相同的应用程序(完全相同的 dll)在开发和生产环境中运行应用程序。这也意味着数据库结构是相同的。
我需要在生产环境中恢复数据库。我只是不确定为什么context.Database.Migrate() 会抛出错误?
完全错误:
应用程序启动异常:System.Data.SqlClient.SqlException (0x80131904): 数据库 'MyDatabaseName' 已经存在。选择一个 不同的数据库名称。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名,布尔异步,Int32 超时,布尔异步写入)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary2 参数值)在 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection 连接,IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 参数值)在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands,IRelationalConnection 连接)在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Create() 在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(字符串 目标迁移)在 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:line 582 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Server.IISIntegration.IISSetupFilter.c__DisplayClass4_0.b__0(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 建设者)在 Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication() ClientConnectionId:7f6b84a3-e0ea-42c7-947d-a9cafdaffbfa 错误 Number:1801,State:3,Class:16 托管环境:Production Content 根路径:C:\WWW\MyProject 现在监听:http://127.0.0.1:24830 申请开始。按 Ctrl+C 关闭。申请是 正在关闭...
【问题讨论】:
-
错误很简单。
context.Database.Migrate();创建数据库。 -
为什么它可以在开发环境中工作?以及为什么我输入
MyDatabaseNameX然后重新启动IIS 会起作用。当我运行应用程序时,它应该会引发相同的错误,但不会。仅在还原时使用。当我开发时,每次调试时都会进行此调用,但不会引发错误。 -
能不能先删除
__efmigrationhistory的表再拿回来试试 -
连接字符串中使用的帐户是否可以访问恢复的数据库?
标签: entity-framework-core entity-framework-core-migrations entity-framework-core-2.1