【发布时间】: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<ILicence, Licence>(); -
你能提供一个最小的可重现的例子吗?或者展示您如何调用
GetLicenceCode以及您的控制器操作是什么样的? -
你能分享一下你的
IMyContextDB和LicenceConfiguration是什么吗?还有你在哪一行犯了这样的错误? -
@Rena 我添加了额外的细节
标签: entity-framework asp.net-core