如何调试 dotnet ef 数据库删除?
Posted
技术标签:
【中文标题】如何调试 dotnet ef 数据库删除?【英文标题】:how to debug dotnet ef database drop? 【发布时间】: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](IInfrastructure
1 accessor) bei Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1 工厂) 北 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”。
【问题讨论】:
我要file a bug on their GitHub page。DbContext
是如何初始化的?您是针对 ASP.NET Core 项目还是类库进行迁移?如果是 ASP.NET Core,请发布您的 Startup
课程。如果是类库,请发布您的 IDesignTimeDbContextFactory
实现。
我的主要问题是:我可以在调试器中以某种方式运行dotnet ef ...
吗?
【参考方案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 ...
【讨论】:
以上是关于如何调试 dotnet ef 数据库删除?的主要内容,如果未能解决你的问题,请参考以下文章
dotnet ef 迁移 name dotnet ef 数据库更新
运行 `dotnet ef dbcontext scaffold` 时省略一列