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

Dan*_*iel 131 entity-framework ef-code-first ef-migrations entity-framework-5

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

我正在使用Package Manager Console使用update-database更新数据库.

谢谢

m_d*_*vid 245

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

所以你可以使用:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以看到您的InnerException.

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

  • 我将它添加到Configuration.Seed方法的顶部.它会弹出一个弹出窗口,让您选择Visual Studio来调试代码.但是,当我选择它时,我的系统会挂起(可能不相关). (11认同)
  • @Talon Go喝咖啡,当你回来的时候可能会弹出另一个Visual Studio实例.:) (5认同)
  • 在配置类的构造函数中. (4认同)
  • 这段代码放在哪里?如果有人可以帮忙!谢谢. (3认同)
  • 是的,这在通过包管理器控制台运行Update-Database时有效.非常便利! (2认同)
  • 有人可以编辑答案以提供完整的解决方案,就像他们向橡皮鸭解释一样吗?(我和橡皮鸭一样聪明)。例如1)启动调试器。2) 设置断点 3.) 将代码添加到构造函数,4) 在控制台中运行 `update-database` 等 (2认同)

rob*_*rus 11

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

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
Run Code Online (Sandbox Code Playgroud)

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

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

Update-Database –TargetMigration: ThePreviousMigrationName
Run Code Online (Sandbox Code Playgroud)


Rui*_*ima 8

我的回答可能有点愚蠢,但无论如何它在这里.如果你像我一样,有时候在Seed()方法中遇到问题,我通常只需创建一个调用Protect Seed()的公共方法.

public void SeedDebug(AppDbContext context)
{
    Seed(context);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的HomeController中,我在调试模式下调用此方法.

public class HomeController : Controller
{
    var appDb = new AppDbContext();
    public ActionResult Index()
    {
        var config = new Configuration();
        config.SeedDebug(appDb);
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 注释种子方法并执行update-database以创建模型
  2. 取消注释方法Seed()并插入我上面提到的"hack".

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

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

  4. 调试您的应用程序,修复错误并删除"黑客"


XDS*_*XDS 7

这是一种更加防故障的方法,它可以毫不费力地解决问题:

步骤#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()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤#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"
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*son 4

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

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