在运行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”。
答案 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添加了作用域生存期到依赖项注入,那么这似乎是一个问题。我提出了一个问题。
答案 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 的实现。将其粘贴到构造函数或第一个断点之前的任意位置,您想点击...
然后使用
控制台输出将告诉您进程ID,这使您可以立即轻松找到正确的进程。通常,将列出几个dotnet进程,尤其是在调试类似
的程序时dotnet ef ...