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 ?
我认为调试器崩溃是因为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)
- "添加…按钮,选择"公共语言运行时异常"作为类型。
- 将异常名称设置为'System.Data.SqlServerCe.SqlCeException'
- 验证并保持"Exceptions"对话框打开。
- 打开列表中的"公共语言运行时异常"部分。
- 取消选中
System.Data.SqlServerCe.SqlCeException
前面的两个复选框(或在您的情况下抛出的异常)并关闭对话框。
删除PDB文件
你可以删除MiniProfiler PDB的文件,但是你必须删除NuGet引用:
- 找到并复制MiniProfiler的dll(从项目的bin文件夹)。当然,不要复制pdb文件。
- 删除所有NuGet对MiniProfiler的引用
- 添加对复制到另一个文件夹的dll的引用。
缺点是你不能使用NuGet来更新MiniProfiler。
也许一个更好的解决方案是从NuGet包中删除PDB,但我不知道它们是否需要用于其他目的。
编辑
正如jrummell在他的评论中指出的那样,PDB的文件可以使用Post Build Event删除。这样你可以保留你的NuGet引用