首页 文章

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

提问于
浏览
123

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

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

谢谢

7 回答

  • 235

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

    所以你可以使用:

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

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

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

  • 2

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

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

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

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

    Update-Database –TargetMigration: ThePreviousMigrationName
    
  • 0

    我的回答可能有点愚蠢,但无论如何它在这里 . 如果你像我一样,有时会在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();
        }
    }
    

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

    • 注释种子方法并执行update-database以创建模型

    • 取消注释方法Seed()并插入我上面提到的“hack” .

    配置中的

    • 禁用自动迁移

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

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

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

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

  • 8

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

    This is what worked for me instead:

    while (!System.Diagnostics.Debugger.IsAttached)
        System.Threading.Thread.Sleep(10);
    
    // Breakpoint after this...
    

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

  • 12

    这是一个更加防止故障的方法,可以毫不费力地完成这个工作:

    步骤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实例 .

  • 2

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

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

相关问题