调试代码优先的Entity Framework迁移代码

时间:2013-06-18 12:35:07

标签: entity-framework ef-code-first entity-framework-5 ef-migrations

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

我正在使用Package Manager Console使用Update-Database更新数据库。

由于

7 个答案:

答案 0 :(得分:240)

我知道EF Code First Migrations是一个相对较新的工具,但不要忘记你还在.NET中。

所以你可以使用:

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

之后你可以看到你的InnerException。

或者您可以像这样使用try ... catch语句: Exception handling Entity Framework

答案 1 :(得分:11)

要在db迁移中达到断点,请在初始化时将上下文设置为MigrateDatabaseToLatestVersion。

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

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

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

Update-Database –TargetMigration: ThePreviousMigrationName

答案 2 :(得分:8)

我的回答可能有点愚蠢,但无论如何它就是这样。 如果你像我一样,有时会在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. 注释种子方法并执行update-database以创建模型
  2. 取消注释方法Seed()并插入我上面提到的“hack”。

  3. 配置中的
  4. 禁用自动迁移

    AutomaticMigrationsEnabled = false; //如果已禁用此功能,则已跳过此步骤

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

答案 3 :(得分:4)

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

注意,只有使用migrate.exe实用程序(pacakges\EntityFramework.x.y.z\tools)运行迁移代码时,才会显示消息。如果您通过Package Manager控制台运行迁移,则不会显示它们。

答案 4 :(得分:3)

这是一种更加防故障的方法,可以轻松解决问题:

步骤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步:在输出目录(/ bin / Debug,/ bin / Release等)中打开一个包含迁移dll的控制台

第4步:使用/ scriptFile参数调用migration.exe以启动调试器并实际调试所需的db-migration

migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"

弹出调试器选择器对话框后,选择您已经打开的Visual Studio实例。

答案 5 :(得分:2)

我在其他地方使用“Debugger.Launch()”(如在m_david's answer above中)有很多运气,但在CreateDbContext中,它似乎以某种方式连接,而不是附加。我的意思是,它附加并开始尝试进入.asm文件和.cpp文件(内部代码)。如果我尝试在Console.Writeline上设置一个断点,我知道之后会执行它(我可以看到来自任何“dotnet ef migrations COMMAND”的输出)它会执行它并且永远不会到达断点。

这对我有用:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

您可以执行迁移并使用Visual Studio手动附加,实际上让您按照预期逐步执行代码,这只是一种痛苦。我真正应该尝试的是两种方法的结合......

答案 6 :(得分:0)

我还找到了一个巧妙的技巧here来获取错误详情......

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