我正在通过.net core mvc 和 EF 开发一个 CRM,它需要大量的数据库连接来检索和更新信息。我在调试过程中时不时会遇到这个错误,这是一个有很多用户的大项目,我不知道它在实际使用中会如何工作!
无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。 对象名称:'XXX'。
在我在startup.cs中使用此设置之前:
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY"))
.ServiceLifetime.Singleton);
该设置偶尔会导致另一个错误:
System.InvalidOperationException:无法跟踪实体类型“TblZZZ”的实例,因为已跟踪具有相同键值 {'ZZZId'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
所以我将设置更改为:
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY"))
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
现在我面临着
Cannot access a disposed context instance
。我不知道什么设置可以解决我的问题。
更新: 我的部分班级:
public partial class TblXXX
{
private ZZZ context;//context
public TblXXX(ZZZ _context)
{
context = _context;
}
public TblXXX() { }
//function for check username
public bool CheckUsernameExit(string username) {
var u = context.TblXXX
.Where(e => e.Username == username)
.FirstOrDefault();
return (u != null);
}
}
在我的控制器中:
public IActionResult Check(UserModelView user)
{
if (ModelState.IsValid)
{
var r = _viewModel.tblXXX.CheckUsernameExit(user.tblXXX.Username);
if (r)
{
toastNotification.AddErrorToastMessage("This email is in use. Enter differernt email.");
return View("Create", _viewModel);
}
这是我的 ViewModel:
public class UserModelView
{
public TblXXX tblXXX { get; set; }
public List<TblXXX > tblXXXList { get; set; }
}
这是我遇到错误的情况之一。
在 ASP.NET Core 中,DbContext 应该是一个 Scoped 服务,而不是 Singleton。
更改此:
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY"))
.ServiceLifetime.Singleton);
至
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY")));
我在方法中使用
_context.Dispose()
时遇到此问题,通过删除并查看代码解决了它。