【问题标题】:how to debug dotnet ef database drop?如何调试 dotnet ef 数据库删除?
【发布时间】: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”。

【问题讨论】:

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

标签: c# asp.net-core entity-framework-core


【解决方案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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2021-05-25
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多