我正在使用代码优先迁移构建一个ASP.NET MVC EF应用程序,并使用Azure SQL DB在Azure中托管它。我第一次发表这篇文章时,它很顺利。但从那时起,我的模型发生了变化,我在Azure DB中的架构没有得到更新以匹配。当我部署时,我确实有#34;执行代码优先迁移"检查。当这不起作用时,我删除了我的数据库,然后在Azure门户中重新创建它,认为这将触发它的更新。但那不起作用,所以我在迁移配置中设置了AutomaticMigrationsEnabled = True。它仍然无法正常工作,所以目前Azure中的数据库没有我的表。我如何让Azure中的数据库被强制更新以匹配我的模型,以便发布的网站可以工作?我确实试过寻找是否有办法将VS本地数据库编写为Create查询并在SQL管理工作室中执行,但无法找到如何做到这一点。
答案 0 :(得分:0)
如果您确定在发布设置中选择了update database
,并且连接字符串是正确的且仍未更新。也许以下内容对您有所帮助:
我有时遇到这样的问题,非常令人沮丧,我的发布文件是正确的,我的设置被设置为允许在发布期间进行SQL更新。但有时数据库尚未更新,我得到一个很好的“支持上下文已更改”错误,有时罪魁祸首是尚未更新的迁移表。不幸的是,让数据库同步的唯一可靠方法是通过比较[dbo].[__MigrationHistory]
如果您发布的服务器缺少最新的迁移历史记录,那么您可以通过在包管理器控制台中键入来生成该脚本的SQL脚本:
Update-Database -Script -TargetMigration [migration name]
'migration name'应该是您发布的服务器具有的 last 迁移的名称,visual studio将生成sql脚本,该脚本可用于使数据库从该目标进行最新迁移迁移。
有时候(尽管非常罕见,它只发生过一次或两次),上述内容无论出于何种原因都不起作用(通常是因为迁移文件已被删除),如果是这种情况,则编写脚本的好主意整个数据库,樱桃挑选你需要的SQL。
Update-Database -Script -SourceMigration:0
这将为每次迁移生成一个脚本,然后您可以根据您所做的更改进行挑选。 “最新”更改将更接近文件的底部。每次迁移都会以if检查开始:
IF @CurrentMigration < '201710160826338_mymigration'
BEGIN
如果选择SQL,可以使用它来选择所需的位,确保包含对迁移历史记录的更新。它将位于if块的末尾,看起来像这样:
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201710101645265_test', N'API.Core.Configuration', 'Some long checksum')
包含迁移历史记录将确保visual studio不再出现问题。
希望这有帮助。