小编Par*_*iri的帖子

无法访问已处置的上下文实例 EF core

我正在通过 .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。我不知道什么设置可以解决我的问题。

我用的是net5.0

更新:我的部分课程:

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

5
推荐指数
2
解决办法
2万
查看次数