dbcontext处理了异常EF核心3.1

时间:2020-10-06 13:24:16

标签: entity-framework asp.net-core

我最近将Web应用程序从ASP.net迁移到了.NETCore,我已经使用DI在startup.cs中注册了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();

               

        }

我还避免了使用“ using”通过上下文检索数据,并且验证了我没有手动调用“ 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;

        }

}

“无法访问已处置的对象。此错误的常见原因是 处理从依赖项注入中解决的上下文,并 然后稍后尝试在您的其他位置使用相同的上下文实例 应用。如果您在计算机上调用Dispose(),可能会发生这种情况。 上下文,或将上下文包装在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: 我试图将方法更改为异步,因为我认为这可能是问题的原因,但不幸的是它仍在发生。

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

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

....

然后在内部

CheckLicence

LICENCECODE LicenceCode = GetLicenceCode(LicenceKey).Result;

1 个答案:

答案 0 :(得分:0)

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

尝试使用瞬态生存期注册该类:

services.AddTransient<ILicence, Licence>();