我首先在我的网站中使用实体框架代码,我只是想知道是否有任何方法可以调试迁移代码。你知道,比如设置断点之类的东西。
我正在使用包管理器控制台来更新数据库Update-Database
。
谢谢
我首先在我的网站中使用实体框架代码,我只是想知道是否有任何方法可以调试迁移代码。你知道,比如设置断点之类的东西。
我正在使用包管理器控制台来更新数据库Update-Database
。
谢谢
我知道 EF Code First Migrations 是相对较新的工具,但不要忘记您仍然在 .NET 中。
所以你可以使用:
if (System.Diagnostics.Debugger.IsAttached == false)
{
System.Diagnostics.Debugger.Launch();
}
之后你可以看到你的 InnerException。
或者您可以像这样使用 try...catch 语句: 异常处理实体框架
要在数据库迁移中遇到断点,请在初始化时将上下文设置为 MigrateDatabaseToLatestVersion。
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
然后您只需正常调试(使用 f5 运行),第一次运行项目时断点就会命中。
现在的问题是,如果您第二次调试,迁移将不会运行。这是因为__MigrationHistory表已更新,表明您已迁移到最新版本。要重新测试迁移,请打开包管理器控制台并降级到以前的迁移:
Update-Database –TargetMigration: ThePreviousMigrationName
我的回答可能有点傻,但无论如何它都在这里。如果您像我一样,有时在 Seed() 方法中遇到问题,我通常所做的只是创建一个调用 Protect Seed() 的公共方法。
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();
}
}
我知道这是一个有点蹩脚的解决方案,但它简单快捷。当然,这必须在创建模型后完成。所以一步一步:
取消注释方法 Seed() 并插入我上面提到的“hack”。
在配置中禁用自动迁移
AutomaticMigrationsEnabled = false;//如果你禁用了这个已经跳过这一步
调试您的应用程序,修复错误并删除“hack”
这是一种更防失败的方法,它可以轻松解决问题:
第 1 步:将这段代码放在要调试的迁移的正上方:
public partial class ORACLE_Test : DbMigration
{
public override void Up()
{
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();
AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
[...]
}
public override void Down()
{
}
}
步骤#2:编译包含您的迁移的项目
步骤#3:在包含迁移的 dll 的输出目录(/bin/Debug、/bin/Release 等)中打开一个控制台
步骤#4:使用 /scriptFile 参数调用 migrate.exe 以启动调试器并实际调试所需的 db-migration
migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"
弹出调试器选择器对话框后,选择您已经打开的 Visual Studio 实例。
您可以将 Console.WriteLine 语句添加到迁移代码(不是一个很好的解决方案)
migrate.exe
请注意,仅当您使用实用程序运行迁移代码时才会显示这些消息(在 中pacakges\EntityFramework.x.y.z\tools
)。如果您通过包管理器控制台运行迁移,它们将不会显示。
我在其他地方使用“Debugger.Launch()”(如上面 m_david 的回答)很幸运,但在 CreateDbContext 内部,它似乎以某种方式既附加又不附加。我的意思是,它附加并开始尝试进入 .asm 文件和 .cpp 文件(内部代码)。如果我尝试在我知道之后执行的 Console.Writeline 上设置断点(我可以看到任何“dotnet ef migrations COMMAND”的输出),它都会执行它并且永远不会到达断点。
这对我有用:
while (!System.Diagnostics.Debugger.IsAttached)
System.Threading.Thread.Sleep(10);
// Breakpoint after this...
您可以使用 Visual Studio 执行迁移并手动附加,它实际上可以让您像预期的那样逐步执行代码,只是更痛苦。我真正应该尝试的是两种方法的结合......
我还在这里找到了一个巧妙的技巧来获取错误详细信息......
基本上,诀窍是从异常中获取所有信息,将其放入字符串中,然后使用生成的字符串和原始异常抛出一个新的 DbEntityValidationException。