148

我首先在我的网站中使用实体框架代码,我只是想知道是否有任何方法可以调试迁移代码。你知道,比如设置断点之类的东西。

我正在使用包管理器控制台来更新数据库Update-Database

谢谢

4

7 回答 7

268

我知道 EF Code First Migrations 是相对较新的工具,但不要忘记您仍然在 .NET 中。

所以你可以使用:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

之后你可以看到你的 InnerException。

或者您可以像这样使用 try...catch 语句: 异常处理实体框架

于 2013-07-19T22:02:36.233 回答
12

要在数据库迁移中遇到断点,请在初始化时将上下文设置为 MigrateDatabaseToLatestVersion。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

然后您只需正常调试(使用 f5 运行),第一次运行项目时断点就会命中。

现在的问题是,如果您第二次调试,迁移将不会运行。这是因为__MigrationHistory表已更新,表明您已迁移到最新版本。要重新测试迁移,请打开包管理器控制台并降级到以前的迁移:

Update-Database –TargetMigration: ThePreviousMigrationName
于 2014-03-10T11:09:14.687 回答
9

我的回答可能有点傻,但无论如何它都在这里。如果您像我一样,有时在 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();
    }
}

我知道这是一个有点蹩脚的解决方案,但它简单快捷。当然,这必须在创建模型后完成。所以一步一步:

  1. 注释种子方法并执行更新数据库以创建模型
  2. 取消注释方法 Seed() 并插入我上面提到的“hack”。

  3. 在配置中禁用自动迁移

    AutomaticMigrationsEnabled = false;//如果你禁用了这个已经跳过这一步

  4. 调试您的应用程序,修复错误并删除“hack”

于 2014-10-25T22:23:47.313 回答
8

这是一种更防失败的方法,它可以轻松解决问题:

第 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 实例。

于 2018-10-08T10:41:39.540 回答
4

您可以将 Console.WriteLine 语句添加到迁移代码(不是一个很好的解决方案)

migrate.exe请注意,仅当您使用实用程序运行迁移代码时才会显示这些消息(在 中pacakges\EntityFramework.x.y.z\tools)。如果您通过包管理器控制台运行迁移,它们将不会显示。

于 2013-07-05T15:11:24.280 回答
2

我在其他地方使用“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 执行迁移并手动附加,它实际上可以让您像预期的那样逐步执行代码,只是更痛苦。我真正应该尝试的是两种方法的结合......

于 2017-10-12T16:40:16.637 回答
0

我还在这里找到了一个巧妙的技巧来获取错误详细信息......

基本上,诀窍是从异常中获取所有信息,将其放入字符串中,然后使用生成的字符串和原始异常抛出一个新的 DbEntityValidationException。

于 2015-06-09T16:45:20.600 回答