我最近将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;
答案 0 :(得分:0)
我想这取决于您如何使用Licence
类,但是这可能与请求的生存期有关,在您完成Licence
中的工作之前。例如,如果您的控制器操作是异步的,则可能发生这种情况。
尝试使用瞬态生存期注册该类:
services.AddTransient<ILicence, Licence>();