我正在通过 .net core mvc 和 EF 开发一个 CRM,它需要大量的数据库连接来检索和更新信息。我在调试过程中时不时会遇到这个错误,这是一个有很多用户的大项目,我不知道它在实际使用中会如何工作!
无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。\r\n对象名称:“XXX”。
在我在startup.cs中使用此设置之前:
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY"))
.ServiceLifetime.Singleton);
Run Code Online (Sandbox Code Playgroud)
该设置偶尔会导致另一个错误:
System.InvalidOperationException:无法跟踪实体类型“TblZZZ”的实例,因为已跟踪具有相同键值 {'ZZZId'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
所以我将我的设置更改为:
services.AddDbContext<XXX>
(option =>
option.UseSqlServer(Configuration.GetConnectionString("YYY"))
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
Run Code Online (Sandbox Code Playgroud)
现在我面临着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); …Run Code Online (Sandbox Code Playgroud) c# database entity-framework dependency-injection asp.net-core