EF代码优先迁移在部署到Azure后无法运行

7
我有两个用于迁移的文件夹(AuthContext和UserProfileContext),每个文件夹都有自己的迁移和一些用于数据迁移等的自定义sql代码。
在使用包管理器控制台时,这个方法很有效:
1. 从生产中还原 2. 运行Update-Database -ConfigurationTypeName Migrations.Auth.Configuration 3. 运行Update-Database -ConfigurationTypeName Migrations.UserProfile.Configuration
然后,在新数据库中,进行了必要的迁移并重新排列了数据。
我试图测试发布时的迁移:
1. 在开发数据库上恢复生产 2. 单个连接字符串(所有上下文都使用相同的连接字符串)指向开发数据库 3. 发布到Azure网站 4. 勾选应用“Code First”迁移框 5. 选择单个连接字符串
它成功发布;但是,当我查看数据库时,什么都没有发生!它没有创建必要的表、列或数据移动。
总之:发布到Azure后,Code First迁移未运行。
更新1:我已经尝试过任何组合:只有一个单个连接字符串,所以我猜那不是问题,并且“执行迁移”被勾选。
在发布时,该API可以运行,但不会更改数据库。我想也许我需要首先触发它,但是当我尝试使用API时(现在当然依赖于新的数据库设置),我只会得到随机错误,并且数据库仍然没有改变。
我看到有些地方提到需要向我的Startup类中添加一些内容,但是我不知道该如何继续。
更新2:通过向连接字符串中添加“Persist Security Info=True”解决了一个问题。现在它实际上连接到数据库并调用我的API;但是,没有迁移正在运行。我在Azure开发环境上附加了调试器并进行了步进操作……在我的第一个数据库调用上,它步入了与所涉及的Migration相关的Configuration类,然后就出问题了,我无法跟踪到错误。
public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\Auth";
    ContextKey = "AuthContext";
}

更新3

好的,我深入研究了一下,第一次访问数据库时出现了错误。是的,这很有道理,因为模型已经改变了,但我已经进行了迁移,并启用和检查了它们!再次强调,当在包管理器控制台中运行“Update-Database”时,它可以正常工作,但在发布到Azure期间使用Execute Code First Migrations时却不行。

与“AuthContext”上下文相关联的模型自创建数据库以来已更改。请考虑使用Code First Migrations来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

更新4

好的,我找到了根本问题所在。VS仅在我的数据库上下文中设置了额外的web.config属性,其中一个没有被提及,实际上是从我的应用程序中首先访问的。

所以现在我必须想办法使其包含多个上下文,或者将所有内容合并到单个上下文中。


你看过这篇文章了吗 http://blogs.msdn.com/b/webdev/archive/2014/04/09/ef-code-first-migrations-deployment-to-an-azure-cloud-service.aspx,看起来你需要在Global.asax的Application_Start代码中添加一些代码。 - J.W.
@J.W. 谢谢,我已经看到了,这是专门针对 Azure 云服务的,而我正在使用 Azure 网站,据说您不需要做任何额外的事情... - Joshua Ohana
我认为你必须确保无论是什么类型的项目,数据库迁移代码都能运行。 - J.W.
@J.W. 您链接文章中的片段表明相反的情况:“另一个选项是设置Web.config转换,使其对Web.config文件进行与单击执行代码优先迁移时Visual Studio所做的相同更改”。Visual Studio 应该在部署期间设置必要的迁移,并且实际上由于Configuration类被调用,某些事情正在发生... - Joshua Ohana
我看到你有多个上下文,这是否意味着你有多个数据库?这通常与EF不兼容。 - J.W.
3个回答

10
这篇文章的答案并不是很详细。
本文解释了我为了修复类似问题所做的工作: https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/ 下面我会大致描述我需要采取的步骤: 步骤1 将连接字符串添加到你的dbContext中,在我的情况下,它们是相同的。

enter image description here

步骤2 将以下内容添加到您的web.config文件中

 <appSettings>
    <add key="MigrateDatabaseToLatestVersion" value="true"/>
  </appSettings>

步骤三 将此内容添加到您的global.asax.cs / Startup.cs(OWIN启动)底部。

    var configuration = new Migrations.Configuration();
    var migrator = new DbMigrator(configuration);
    migrator.Update();

无法在我的发布助手中看到“DATA”部分,但不管怎样,还是成功了,谢谢! - Daniel
1
太好了。我必须添加你提到的代码才能在启动时调用我的Seed方法。非常感谢,我花了几个小时来解决这个问题。 - rollsch
非常感谢您!您的解决方案在Azure生成的示例Xamarin Forms服务器代码项目中有效。我没有global.asax.cs文件,所以我将代码添加到Startup.MobileApp.cs中的ConfigureMobileApp()方法中。 - Elijah Lofgren

4
解决了!为了让后人更好地理解解决方案,总结如下:启用“Code First Migrations”仅为每个选中的复选框启用一个基本连接字符串,而不管有多少上下文对该基本连接字符串进行迁移。因此,在我的情况下,我将两个相关的上下文拆分为两个不同的连接字符串。
然后,我遇到了其他错误,并确定如果您正在更改与ASP身份验证支持模型的基本连接字符串,则需要包含(一次发布)附加标志base("AuthContext", throwIfV1Schema: false)。

0
对于任何遇到此问题并可能忽略以下内容的人:请确保检查您是否已正确设置了Web.config文件和/或Azure上的应用程序设置中的连接字符串。这包括DefaultConnection和DefaultConnection_DatabasePublish。
在我们的情况下,前者是正确的,但后者包含错误的数据库实例,因为它已从应用服务克隆操作中传递过来。因此,错误的数据库正在进行迁移。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接