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

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

问题描述:

正在运行dotnet ef database drop我收到一条错误消息。我怎样才能调试这个命令,获得更多关于这个问题的细节?或者我怎么能找到这个错误的来源?如何调试dotnet ef数据库丢弃?

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

+0

我[他们的GitHub页面上提交一个bug(https://github.com/aspnet/EntityFrameworkCore/issues)。 – mason

+1

'DbContext'如何初始化?您是否针对ASP.NET Core项目或类库进行迁移?如果它是ASP.NET Core,请发布你的'Startup'类。如果它是一个类库,请发布您的'IDesignTimeDbContextFactory'实现。 –

+0

我的主要问题是:我能以某种方式在调试器中运行'dotnet ef ...'吗? – Sam

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

+0

EF Core 2修正了此问题。EF Core 1.1不会修复此问题。 – Lars

添加代码在你的DbContext构造函数等待一个调试器,你就可以调试:

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

然后用你喜欢的调试器附加DOTNET过程。