调试代码-首先是实体框架迁移代码

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

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

谢谢

45731 次浏览

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

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

我知道 EF 代码首次迁移是一个相对较新的工具,但是不要忘记你还在.NET 中。

所以你可以使用:

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

然后您可以看到 InnerException。

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

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

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

然后,您只需按照正常方式进行调试(使用 f5运行) ,第一次运行项目时就会触发断点。

现在的问题是,如果第二次进行调试,迁移将无法运行。这是因为 移民历史表已经更新为说明您已经迁移到最新版本。要重新测试迁移,请打开包管理器控制台并降级到上一次迁移:

Update-Database –TargetMigration: ThePreviousMigrationName

我的回答可能有点傻,但无论如何,它去了。 如果您像我一样,有时在 Seed()方法中遇到问题,我通常只需创建一个调用 ProteceSeed()的公共方法。

public void SeedDebug(AppDbContext context)
{
Seed(context);
}

然后在我的 HomeController 中,我在 Debug 模式下调用这个方法。

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. 调试您的应用程序,修复错误,并删除“黑客”

我还发现了一个巧妙的技巧 给你得到的错误细节..。

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

我用“调试器”的时候运气不错。Launch ()”(就像在 以上是大卫的回答中一样) ,但在 CreateDbContext 中,它似乎既附加又不附加。我的意思是,它附着并开始试图进入。还有。Cpp 文件(内部代码)。如果尝试在控制台上设置断点。我所知道的 Writeline 在之后执行(我可以看到任何“ dotnet ef 迁移 COMMAND”的输出) ,它既执行它,也从来不会到达断点。

这就是对我有效的方法:

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


// Breakpoint after this...

您可以执行迁移并使用 Visual Studio 手动附加,而且它的 威尔实际上可以让您像预期的那样逐步执行代码,这只是比较麻烦而已。我真正应该尝试的是两种方法的结合..。

这里有一个更加万无一失的方法,可以不费吹灰之力地解决这个问题:

步骤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/Releaseetc)中打开一个控制台,其中包含迁移的 dll

步骤 # 4: 使用/scriptFile 参数调用 Migate.exe 以启动调试器并实际调试所需的 db 迁移

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

一旦调试器选择器对话框弹出,选择您已经打开的视觉工作室实例。