如何调试 dotnet ef 数据库删除?

Posted

技术标签:

【中文标题】如何调试 dotnet ef 数据库删除?【英文标题】:how to debug dotnet ef database drop? 【发布时间】:2018-06-08 05:43:12 【问题描述】:

在运行dotnet ef database drop 时出现错误。如何调试此命令以获取有关问题的更多详细信息?或者我怎样才能找到这个错误的根源?

System.ObjectDisposedException:无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。 对象名称:“ApplicationDbContext”。 北 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() 北 Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure.get_Instance() 北 Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure1 accessor) bei Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func1 工厂) 北 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType) 北 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.DropDatabase(String contextType) bei Microsoft.EntityFrameworkCore.Design.OperationExecutor.DropDatabaseImpl(String contextType) 北 Microsoft.EntityFrameworkCore.Design.OperationExecutor.DropDatabase.c__DisplayClass0_1.<.ctor>b__0() bei Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action 动作) 无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。 对象名称:“ApplicationDbContext”。

【问题讨论】:

我要file a bug on their GitHub page。 DbContext 是如何初始化的?您是针对 ASP.NET Core 项目还是类库进行迁移?如果是 ASP.NET Core,请发布您的 Startup 课程。如果是类库,请发布您的 IDesignTimeDbContextFactory 实现。 我的主要问题是:我可以在调试器中以某种方式运行dotnet ef ... 吗? 【参考方案1】:

我有同样的问题,并将其添加到 DbContext:

private void PrintStackTrace()

  var st = new StackTrace();
  foreach (var sf in st.GetFrames())
    Console.WriteLine($"sf.GetMethod().DeclaringType.Assembly.GetName().Name sf.GetMethod().DeclaringType.Name sf.GetMethod().Name");

并在 DbContext 的构造函数和 Dispose 中调用此函数。

如果将 DbContext 的作用域生命周期添加到依赖注入中,这似乎是一个问题。我为此提交了一个问题。

https://github.com/aspnet/EntityFrameworkCore/issues/10693

【讨论】:

EF Core 2 已解决此问题。EF Core 1.1 将无法修复此问题。【参考方案2】:

在 DbContext 构造函数中添加等待调试器的代码,您就可以进行调试了:

public class ApplicationDbContext: DbContext

    public ApplicationDbContext()
    
        while (!Debugger.IsAttached)
        
            Thread.Sleep(100);
        
    
    ...

然后使用您喜欢的调试器附加 dotnet 进程。

【讨论】:

【参考方案3】:

来自火星回答的水族补充:

Console.Out.WriteLine("Current ProcessID: " + Process.GetCurrentProcess().Id); //This prints the process id
Console.Out.WriteLine("Waiting for debugger to attach...");
while (!Debugger.IsAttached)

    Thread.Sleep(100);

Console.Out.WriteLine("Debugger attached!");

此代码可以添加到将要运行的代码中的任何位置,在我的例子中是 IDesignTimeServices 的实现。将其粘贴到构造函数或第一个断点之前的任何位置,您要点击...

然后要么使用

Visual Studio:调试->附加到进程 Jetbrains Rider:运行->附加到进程 知道附加到您熟悉的正在运行的进程的任何其他调试器

控制台输出将告诉您进程 ID,这使您可以立即轻松找到正确的进程。通常,会列出几个 dotnet 进程,尤其是在调试类似的东西时

dotnet ef ...

【讨论】:

以上是关于如何调试 dotnet ef 数据库删除?的主要内容,如果未能解决你的问题,请参考以下文章

dotnet ef 迁移 name dotnet ef 数据库更新

dotnet ef 用于开发/生产的单独数据库提供程序

运行 `dotnet ef dbcontext scaffold` 时省略一列

无法在 Mac 上使用 dotnet ef 核心搭建脚手架

Dotnet EF Core 2.1 在查询小数属性时抛出 QueryClientEvaluationWarning

dotnet tool install --global dotnet-ef 失败