debugging代码 – 第一个entity framework迁移代码

我在我的网站中首先使用实体​​框架代码,我只是想知道是否有任何方法来debugging迁移代码。 你知道,像设置断点和这样的东西。

我使用软件包pipe理器控制台来使用update-database来更新数据库。

谢谢

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

所以你可以使用:

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

之后,你可以看到你的InnerException。

或者你可以使用try … catch语句,如下所示: exception处理entity framework

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

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

然后你只需要正常的debugging(使用f5运行),并且在你第一次运行项目时会产生断点。

现在的问题是,如果您再次debugging,迁移将无法运行。 这是因为__MigrationHistory表已经更新,说你已经迁移到最新版本。 要重新testing迁移,请打开包pipe理器控制台并降级到以前的迁移:

 Update-Database –TargetMigration: ThePreviousMigrationName 

我的答案可能有点愚蠢,但无论如何,这里。 如果你和我一样,在Seed()方法中有时会遇到问题,我通常只是创build一个调用Protect Seed()的公共方法。

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

然后在我的HomeController我调用这个方法在debugging模式。

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

我知道这是一个有点蹩脚的解决scheme,但它很简单,快捷。 当然这是在模型创build完成之后才能完成的。 所以一步一步:

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

  3. 在configuration中禁用自动迁移

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

  4. debugging您的应用程序,修复错误,并删除“黑客”

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

请注意,只有在使用pacakges\EntityFramework.xyz\tools实用程序(位于pacakges\EntityFramework.xyz\tools )中运行迁移代码时,才会显示消息。 如果通过程序包pipe理器控制台运行迁移,它们将不会显示。

我也find了一个巧妙的技巧来获取错误的详细信息…

基本上,诀窍是从exception中获取所有的信息,把它放在一个string中,并用生成的string和原始exception抛出一个新的DbEntityValidationException。

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