DbContext上的ObjectDisposedException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DbContext上的ObjectDisposedException相关的知识,希望对你有一定的参考价值。
使用从另一个服务注入到服务中的DbContext
时出现以下错误:
ObjectDisposedException: Cannot access a disposed object.
我的DbContext
的生存期是Scoped
,而我的服务的生存期是Transient
,但是将其更改为Singleton
(我们不希望)而不解决这个问题。
有趣的是,错误似乎是随机发生的。有时没有错误,一切正常。
关于此错误,当我的Angular应用开始向后端触发请求时,我(也是随机地)在启动后立即得到了InvalidOperationException
。"An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point."
我的代码:
public class MyService1 {
private static IMyService2 _myService2;
public MyService1(IMyService2 myService2){
_myService2 = myService2;
}
public async Task DoSomethingWithMyService2() {
await _myService2.DoSomething(new MyEntity());
}
}
public class MyService2 : IMyService2 {
private MyDbContext _dbContext;
public MyService2(MyDbContext myDbContext) {
_dbContext = myDbContext;
}
public async Task DoSomething(MyEntity myEntity) {
await _dbContext.MySet.AddAsync(myEntity); // <-- ObjectDisposedException
await _dbContext.SaveChangesAsync();
}
}
回答我自己的问题:罪魁祸首是在将MyService2
注入static
后将其存储在MyService1
字段中。
由于DbContext
的生存期为Scoped
,将在对服务的初始请求后将其丢弃。但是,该服务将在引用整个应用程序的DbContext的整个生存期内继续运行。
((对于应用程序的生命周期,我并不完全确定,因为MyService1
本身也是Transient
。也许其他人可以解释它的工作原理。)
以上是关于DbContext上的ObjectDisposedException的主要内容,如果未能解决你的问题,请参考以下文章
使用具有多个 DB 模式但使用一个 DBContext 的 Entity Framework 6