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完成之后才能完成的。 所以一步一步:
- 注释种子方法并执行更新数据库来创build模型
-
取消注释Seed()方法并插入上面提到的“hack”。
-
在configuration中禁用自动迁移
AutomaticMigrationsEnabled = false; //如果你已经禁用了这个步骤
-
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进行手动连接,它实际上可以让您像预期的那样逐步完成代码,这更加痛苦。 我真正应该尝试的是两种方法的结合…