【问题标题】:Dbcontext disposed exception EF core 3.1Dbcontext 处理异常 EF core 3.1
【发布时间】:2021-01-21 09:20:18
【问题描述】:

我最近将我的 Web 应用程序从 ASP.net 迁移到 .NETCore,我已经在我的 startup.cs 中使用 DI 注册了 DBcontext

services.AddDbContext<MyContextDB>

                (options =>

            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")),

....

public partial class MyContextDB: IdentityDbContext<USER>, IMyContextDB

...

   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

        {

            optionsBuilder.UseLazyLoadingProxies();

               

        }

我还避免使用“使用”来通过上下文检索数据,并且我验证我没有任何手动调用“Dispose()”上下文

但是,每当我到达应用程序的这一部分时,我都会收到此异常:

     public class Licence : ILicence

        {

            private static IOptionsMonitor<LicenceConfiguration> _appSettings;

   

            private readonly MyContextDB _context;

   

            public Licence(MyContextDB context, IOptionsMonitor<LicenceConfiguration> optionsAccessor)

            {

                _context = context;

                _appSettings = optionsAccessor;

            }

public LICENCECODE GetLicenceCode(string key)

        {

            LICENCECODE LicenceCode = null;

            LicenceCode = _context.LICENCECODE.SingleOrDefault(l => l.LICENCEKEY == key);



            return LicenceCode;

        }

}

“无法访问已处置的对象。此错误的常见原因是 处理从依赖注入解决的上下文和 然后稍后尝试在您的其他地方使用相同的上下文实例 应用。如果您在 上下文,或将上下文包装在 using 语句中。如果你是 使用依赖注入,你应该让依赖注入 容器负责处理上下文实例。\r\n对象名称: 'MyContextDB'。”

我浏览了互联网上所有关于此异常的文章,但我无法确定它的实际原因。

你能帮我解决一下吗

在进行此调用时会专门引发异常:

  public async Task<LICENCECODE> GetLicenceCode(string key)

        {

            LICENCECODE LicenceCode = null;

            LicenceCode = await _context.LICENCECODE.SingleOrDefaultAsync(l => l.LICENCEKEY == key);



            return LicenceCode;

        }

PS:我尝试将方法更改为异步,因为我认为这可能是问题的原因,但不幸的是它仍在发生。

对该方法的调用来自另一个模型类

validLicence = _licence.CheckLicence(type.Name, ref message, out maxCount);

....

然后在里面

检查许可证

LICENCECODE LicenceCode = GetLicenceCode(LicenceKey).Result;

【问题讨论】:

  • License 的范围/生命周期是多少? IE。你是如何在 DI 框架中注册的?
  • @Xerillio 它的作用域:services.AddScoped&lt;ILicence, Licence&gt;();
  • 你能提供一个最小的可重现的例子吗?或者展示您如何调用GetLicenceCode 以及您的控制器操作是什么样的?
  • 你能分享一下你的IMyContextDBLicenceConfiguration是什么吗?还有你在哪一行犯了这样的错误?
  • @Rena 我添加了额外的细节

标签: entity-framework asp.net-core


【解决方案1】:

我想这取决于您如何使用 Licence 类,但这可能与在您完成 Licence 中的工作之前结束的请求的生命周期有关。例如,如果您的控制器操作是异步的,就会发生这种情况。

尝试使用瞬态生命周期注册类:

services.AddTransient<ILicence, Licence>(); 

【讨论】:

  • 我试过了,还是一样,我不断收到异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2021-06-04
  • 2019-02-10
相关资源
最近更新 更多