Miniprofiler在缺少CreatedOn列时中断

本文关键字:中断 CreatedOn Miniprofiler | 更新日期: 2023-09-27 18:02:47

我在EF 6.1的web应用程序(asp.net-mvc)中安装了miniprofiler,它在一行上出现以下错误信息:

类型为"System.Data.SqlClient"的异常。SqlException'发生在在用户代码

中未处理MiniProfiler.dll

附加信息:无效的列名"CreatedOn"。

为什么会发生这种情况?我以前用的是EF 5,后来升级到版本6,后来升级到6.1。

这篇文章和这篇文章有一些变通方法,并且也说当你从4.3版本升级时会发生这种情况。在我的web应用程序中不是这样的。

有没有人通过不绕过它来修复这个bug ?

Miniprofiler在缺少CreatedOn列时中断

我认为调试器崩溃是因为PDB文件包含在MiniProfiler NuGet包中。

当实体框架试图确定__MigrationHistory表中是否存在列CreatedOn时抛出异常时,将发生break。(代码用IlSpy从System.Data.Entity.Migrations.History.HistoryRepository.GetUpgradeOperations()中提取)

bool flag = false;
try
{
    this.InjectInterceptionContext(legacyHistoryContext);
    using (new TransactionScope(TransactionScopeOption.Suppress))
    {
        (
            from h in legacyHistoryContext.History
            select h.CreatedOn).FirstOrDefault<DateTime>(); // Will throw an exception if the column is absent
    }
    flag = true;
}
catch (EntityException)
{
}
if (flag)
{
    // Remove the column if present (if no exception was thrown)
    yield return new DropColumnOperation("dbo.__MigrationHistory", "CreatedOn", null);
}

您可以注意到,如果您手动创建列以避免异常,那么它将在下次运行时被删除,并且异常将再次出现。当MiniProfiler在DbCommand. executereader()中插入自己时,它在catch之前的异常路径上(linq查询转换为sql查询,并最终使用DbCommand执行)。

你有两个解决方案来防止中断的发生:

禁用该类型异常的中断

您可以在Visual Studio调试器中禁用特定异常的中断。我正在使用Sql CE,所以我必须首先声明SqlCeException(步骤2到4)。如果你正在使用SqlServer,你可能会跳过这一步,只需检查抛出的异常类型是否已经在列表中。

    打开"Exceptions"对话框(菜单Debug/Exceptions)
  1. "添加…按钮,选择"公共语言运行时异常"作为类型。
  2. 将异常名称设置为'System.Data.SqlServerCe.SqlCeException'
  3. 验证并保持"Exceptions"对话框打开。
  4. 打开列表中的"公共语言运行时异常"部分。
  5. 取消选中System.Data.SqlServerCe.SqlCeException前面的两个复选框(或在您的情况下抛出的异常)并关闭对话框。
从现在开始,异常不应该引起中断。但是,调试器即使在你自己的代码中也不会中断,如果MiniProfiler在另一种情况下抛出另一种类型的异常,则会再次发生中断。

删除PDB文件

你可以删除MiniProfiler PDB的文件,但是你必须删除NuGet引用:

  1. 找到并复制MiniProfiler的dll(从项目的bin文件夹)。当然,不要复制pdb文件。
  2. 删除所有NuGet对MiniProfiler的引用
  3. 添加对复制到另一个文件夹的dll的引用。

缺点是你不能使用NuGet来更新MiniProfiler。

也许一个更好的解决方案是从NuGet包中删除PDB,但我不知道它们是否需要用于其他目的。

编辑

正如jrummell在他的评论中指出的那样,PDB的文件可以使用Post Build Event删除。这样你可以保留你的NuGet引用