如何调试dotnet ef数据库丢弃?

时间:2017-12-27 15:18:32

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

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

  

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

3 个答案:

答案 0 :(得分: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。

如果将DbContext添加了作用域生存期到依赖项注入,那么这似乎是一个问题。我提出了一个问题。

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

答案 1 :(得分:0)

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

user>
(def primes (cons 2 (filter (fn [n]
                              (let [sqn (Math/sqrt n)]
                                (not-any? #(zero? (rem n %))
                                          (take-while #(<= % sqn) primes))))
                            (iterate #(+ 2 %) 3))))
#'user/primes

user> (last (take 10000 primes))
104729

user> (take 20 primes)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71)

user> (last (take 10000 primes))
104729

user> (last (take 100000 primes))
1299709

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

答案 2 :(得分:0)

火星回答中对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 Rider:运行->附加处理
  • 任何其他知道可以附加到您熟悉的正在运行的进程中的调试器

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

的程序时
dotnet ef ...