public void SeedDebug(AppDbContext context)
{
Seed(context);
}
然后在我的HomeController中,我在调试模式下调用此方法 .
public class HomeController : Controller
{
var appDb = new AppDbContext();
public ActionResult Index()
{
var config = new Configuration();
config.SeedDebug(appDb);
return View();
}
}
7 回答
我知道EF Code First Migrations是一个相对较新的工具,但不要忘记你还在.NET中 .
所以你可以使用:
之后,您可以看到您的InnerException .
或者你可以像这样使用try ... catch语句:Exception handling Entity Framework
要在db迁移中达到断点,请在初始化时将上下文设置为MigrateDatabaseToLatestVersion .
然后你只需正常调试(使用f5运行),断点将在你第一次运行项目时命中 .
现在的问题是,如果再次调试,则不会运行迁移 . 这是因为 __MigrationHistory 表已更新,表示您已迁移到最新版本 . 要重新测试迁移,请打开包管理器控制台并降级到先前的迁移:
我的回答可能有点愚蠢,但无论如何它在这里 . 如果你像我一样,有时会在Seed()方法中遇到问题,我通常会创建一个调用Protect Seed()的公共方法 .
然后在我的HomeController中,我在调试模式下调用此方法 .
我知道这是一个有点蹩脚的解决方案,但它简单快捷 . 当然,这必须在创建模型后完成 . 所以一步一步:
注释种子方法并执行update-database以创建模型
取消注释方法Seed()并插入我上面提到的“hack” .
配置中的
AutomaticMigrationsEnabled = false; //如果已禁用此功能,则已跳过此步骤
您可以将Console.WriteLine语句添加到迁移代码(不是一个很好的解决方案)
请注意,仅当您使用
migrate.exe
实用程序(在pacakges\EntityFramework.x.y.z\tools
中)运行迁移代码时,才会显示消息 . 如果您通过Package Manager控制台运行迁移,则不会显示它们 .我在其他地方使用"Debugger.Launch()"(如在m_david's answer above中)有很多运气,但在CreateDbContext内部它似乎以某种方式附着,而不是附加 . 我的意思是,它附加并开始尝试进入.asm文件和.cpp文件(内部代码) . 如果我尝试在Console.Writeline上设置一个断点,我知道之后会执行它(我可以看到来自任何"dotnet ef migrations COMMAND"的输出)它会执行它并且永远不会遇到断点 .
This is what worked for me instead:
您可以使用Visual Studio执行迁移并手动附加,它实际上可以让您像预期的那样单步执行代码,这只是一种痛苦 . 我应该尝试的是两种方法的结合......
这是一个更加防止故障的方法,可以毫不费力地完成这个工作:
步骤1:将这段代码放在要调试的迁移的正上方:
步骤2:编译包含迁移的项目
步骤#3:打开包含迁移dll的输出目录(/ bin / Debug,/ bin / Release等)中的控制台
步骤#4:使用/ scriptFile参数调用migrate.exe以启动调试器并实际调试所需的db-migration
弹出调试器 - 选择器对话框后,选择已打开的visual studio实例 .
我还找到了一个巧妙的技巧here以获取错误详情......
基本上,诀窍是从异常中获取所有信息,将其放入字符串中并使用生成的字符串和原始异常抛出新的DbEntityValidationException .