EF Code First 迁移在 Azure Web 角色上抛出 StackOverflowException
EF Code First Migration throws StackOverflowException on Azure Web Role
在 Azure Web 角色 (WS 2012 R2) 中执行 EF 6.1.2 代码优先迁移时会出现此问题。相同的迁移 运行 在本地很好,即使我将连接字符串指向 (Azure) Sql 数据库。
WhosebugException 由 Entity Framework 代码抛出,我的任何迁移的第一行甚至都没有被命中。
我尝试了 运行三种不同的迁移方式:
DbMigrator migrator = new DbMigrator(configuration);
migrator.Update(); // Here the exception is thrown
秒:
DbMigrator migrator = new DbMigrator(configuration);
pendingMigrations = migrator.GetPendingMigrations().ToList();
foreach (string pendingMigration in pendingMigrations)
{
migrator.Update(pendingMigration); // Here the exception is thrown
}
并使用 web.config:
<contexts>
<context type="Superb.WorkNextDoor.EFRepository.Context.WndDbContext, Superb.WorkNextDoor.EFRepository, Version=1.0.0.0, Culture=neutral">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Superb.WorkNextDoor.EFRepository.Context.WndDbContext, Superb.WorkNextDoor.EFRepository], [Superb.WorkNextDoor.EFRepository.Migrations.Migrations.WndDbMigrationsConfiguration, Superb.WorkNextDoor.EFRepository.Migrations]], EntityFramework">
</databaseInitializer>
</context>
</contexts>
我在远程调试 Web 角色时在 Visual Studio 中看到 WhosebugException。 Web 角色的 windows 事件日志中记录了一个错误(此 post 底部的日志信息)。
我有两次迁移。我试过 运行第一个来自 PMC,第二个来自网络角色,但没有成功。
我已经尝试在服务器上安装 .Net 4.5.2,将 VM 大小从 XS 更改为 S,并将 EF 降级到版本 6.1.1。没有任何效果。此外,我尝试将文件夹 "E:\sites[=47=]" 从网络角色下载到我的本地计算机,在 IIS 上安装该应用程序并附加我的 VS 调试器,它不会抛出该异常。我的 Windows 8.1 和那个 Windows Server 2012 R2 之间一定有什么不同。
我花了很多时间尝试不同的事情,但我不想放弃,不得不从包管理器控制台执行我的迁移。
Log Name: Application Source: Application Error Date:
1/11/2015 3:21:42 AM Event ID: 1000 Task Category: (100) Level:
Error Keywords: Classic User: N/A Computer:
RD0003FF508F5B Description: Faulting application name: w3wp.exe,
version: 8.5.9600.16384, time stamp: 0x5215df96 Faulting module name:
clr.dll, version: 4.0.30319.34014, time stamp: 0x52e0b86c Exception
code: 0xc00000fd Fault offset: 0x0000000000195499 Faulting process id:
0xc60 Faulting application start time: 0x01d02d4d77fdfb93 Faulting
application path: d:\windows\system32\inetsrv\w3wp.exe Faulting module
path: D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Report
Id: f5e4d6dc-9940-11e4-80bd-0003ff508f5b Faulting package full name:
Faulting package-relative application ID: Event Xml:
1000
2
100
0x80000000000000
467
Application
RD0003FF508F5B
w3wp.exe
8.5.9600.16384
5215df96
clr.dll
4.0.30319.34014
52e0b86c
c00000fd
0000000000195499
c60
01d02d4d77fdfb93
d:\windows\system32\inetsrv\w3wp.exe
D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
f5e4d6dc-9940-11e4-80bd-0003ff508f5b
重现此错误的简单步骤:
- 下载此示例项目:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application
- 将 CloudServiceProject 添加到解决方案并将 Web 项目添加为 Web 角色
- 发布到 azure
- 浏览网站并转到学生选项卡(这会访问数据库并且初始化程序会尝试执行迁移)。
- 情况相同。
WhosebugException 的罪魁祸首竟然是 IntelliTrace。我不知道导致此行为的 IntelliTrace 和代码优先迁移之间问题的根本原因,但是当我下载 IntelliTrace 日志时,我可以看到很多 Sql 异常:
我已经为此浪费了很多时间,所以我不会进一步调查。现在对我来说最简单的解决方法是在部署我的 Web 角色之前禁用 IntelliTrace:
如果有人好奇,这里是IntelliTrace logs。
我希望这可以帮助其他人解决此类问题,而不会像我一样浪费太多时间。
这被确定为 Microsoft Visual Studio 2013 Update 4 中的错误。作为临时解决方法,在 IntelliTrace 设置 -> IntelliTrace 事件下禁用 "Lazy Initialization"。我们正在研究在 Visual Studio 2013 的未来更新中修复此错误。
在 Azure Web 角色 (WS 2012 R2) 中执行 EF 6.1.2 代码优先迁移时会出现此问题。相同的迁移 运行 在本地很好,即使我将连接字符串指向 (Azure) Sql 数据库。
WhosebugException 由 Entity Framework 代码抛出,我的任何迁移的第一行甚至都没有被命中。
我尝试了 运行三种不同的迁移方式:
DbMigrator migrator = new DbMigrator(configuration);
migrator.Update(); // Here the exception is thrown
秒:
DbMigrator migrator = new DbMigrator(configuration);
pendingMigrations = migrator.GetPendingMigrations().ToList();
foreach (string pendingMigration in pendingMigrations)
{
migrator.Update(pendingMigration); // Here the exception is thrown
}
并使用 web.config:
<contexts>
<context type="Superb.WorkNextDoor.EFRepository.Context.WndDbContext, Superb.WorkNextDoor.EFRepository, Version=1.0.0.0, Culture=neutral">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Superb.WorkNextDoor.EFRepository.Context.WndDbContext, Superb.WorkNextDoor.EFRepository], [Superb.WorkNextDoor.EFRepository.Migrations.Migrations.WndDbMigrationsConfiguration, Superb.WorkNextDoor.EFRepository.Migrations]], EntityFramework">
</databaseInitializer>
</context>
</contexts>
我在远程调试 Web 角色时在 Visual Studio 中看到 WhosebugException。 Web 角色的 windows 事件日志中记录了一个错误(此 post 底部的日志信息)。
我有两次迁移。我试过 运行第一个来自 PMC,第二个来自网络角色,但没有成功。
我已经尝试在服务器上安装 .Net 4.5.2,将 VM 大小从 XS 更改为 S,并将 EF 降级到版本 6.1.1。没有任何效果。此外,我尝试将文件夹 "E:\sites[=47=]" 从网络角色下载到我的本地计算机,在 IIS 上安装该应用程序并附加我的 VS 调试器,它不会抛出该异常。我的 Windows 8.1 和那个 Windows Server 2012 R2 之间一定有什么不同。
我花了很多时间尝试不同的事情,但我不想放弃,不得不从包管理器控制台执行我的迁移。
Log Name: Application Source: Application Error Date:
1/11/2015 3:21:42 AM Event ID: 1000 Task Category: (100) Level:
Error Keywords: Classic User: N/A Computer:
RD0003FF508F5B Description: Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x5215df96 Faulting module name: clr.dll, version: 4.0.30319.34014, time stamp: 0x52e0b86c Exception code: 0xc00000fd Fault offset: 0x0000000000195499 Faulting process id: 0xc60 Faulting application start time: 0x01d02d4d77fdfb93 Faulting application path: d:\windows\system32\inetsrv\w3wp.exe Faulting module path: D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Report Id: f5e4d6dc-9940-11e4-80bd-0003ff508f5b Faulting package full name: Faulting package-relative application ID: Event Xml:
1000 2 100 0x80000000000000 467 Application RD0003FF508F5B w3wp.exe 8.5.9600.16384 5215df96 clr.dll 4.0.30319.34014 52e0b86c c00000fd 0000000000195499 c60 01d02d4d77fdfb93 d:\windows\system32\inetsrv\w3wp.exe D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll f5e4d6dc-9940-11e4-80bd-0003ff508f5b
重现此错误的简单步骤:
- 下载此示例项目:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application
- 将 CloudServiceProject 添加到解决方案并将 Web 项目添加为 Web 角色
- 发布到 azure
- 浏览网站并转到学生选项卡(这会访问数据库并且初始化程序会尝试执行迁移)。
- 情况相同。
WhosebugException 的罪魁祸首竟然是 IntelliTrace。我不知道导致此行为的 IntelliTrace 和代码优先迁移之间问题的根本原因,但是当我下载 IntelliTrace 日志时,我可以看到很多 Sql 异常:
我已经为此浪费了很多时间,所以我不会进一步调查。现在对我来说最简单的解决方法是在部署我的 Web 角色之前禁用 IntelliTrace:
如果有人好奇,这里是IntelliTrace logs。
我希望这可以帮助其他人解决此类问题,而不会像我一样浪费太多时间。
这被确定为 Microsoft Visual Studio 2013 Update 4 中的错误。作为临时解决方法,在 IntelliTrace 设置 -> IntelliTrace 事件下禁用 "Lazy Initialization"。我们正在研究在 Visual Studio 2013 的未来更新中修复此错误。