代码之家  ›  专栏  ›  技术社区  ›  Sam

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

  •  2
  • Sam  · 技术社区  · 8 年前

    运行时 dotnet ef database drop 我出错了。如何调试此命令,以获取有关问题的更多详细信息?或者,如何找到此错误的来源?

    系统ObjectDisposedException:无法访问已释放的对象。此错误的一个常见原因是处理通过依赖项注入解析的上下文,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文调用Dispose(),或将上下文包装到using语句中,可能会发生这种情况。如果您使用的是依赖项注入,那么应该让依赖项注入容器处理上下文实例。 对象名称:“ApplicationDbContext”。 bei微软。EntityFrameworkCore。DbContext。get\u InternalServiceProvider() bei微软。EntityFrameworkCore。DbContext。微软EntityFrameworkCore。基础设施IInfrastructure。get\u实例() bei微软。EntityFrameworkCore。基础设施AccessorExtensions。GetService[服务](IInfrastructure 1 accessor) bei Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func 1个工厂) bei微软。EntityFrameworkCore。设计内部的DbContextOperations。CreateContext(字符串contextType) bei微软。EntityFrameworkCore。设计内部的DbContextOperations。DropDatabase(字符串contextType) bei微软。EntityFrameworkCore。设计操作执行器。DropDatabaseImpl(字符串contextType) bei微软。EntityFrameworkCore。设计操作执行器。DropDatabase<&燃气轮机;c\u显示类别0\u 1&书信电报;。ctor>b\uu 0() bei微软。EntityFrameworkCore。设计操作执行器。OperationBase。执行(动作动作) 无法访问已释放的对象。此错误的一个常见原因是处理通过依赖项注入解析的上下文,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文调用Dispose(),或将上下文包装到using语句中,可能会发生这种情况。如果您使用的是依赖项注入,那么应该让依赖项注入容器处理上下文实例。 对象名称:“ApplicationDbContext”。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Lars    8 年前

    我也有同样的问题,并将其添加到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。

    如果在依赖项注入中添加具有作用域生存期的DbContext,这似乎是一个问题。我为此提出诉讼。

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

        2
  •  2
  •   agua from mars    8 年前

    添加代码以等待DbContext构造函数中的调试器,您将能够调试:

    public class ApplicationDbContext: DbContext
    {
        public ApplicationDbContext()
        {
            while (!Debugger.IsAttached)
            {
                Thread.Sleep(100);
            }
        }
        ...
    }
    

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

        3
  •  2
  •   Frithjof Schaefer    6 年前

    mars答案中对aqua的补充:

    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骑手:跑步->附加到进程
    • 知道附加到您熟悉的正在运行的进程的任何其他调试器

    控制台输出将告诉您进程id,从而可以轻松地立即找到正确的进程。通常,会列出几个dotnet进程,尤其是在调试以下内容时

    dotnet ef ...
    
    推荐文章