【问题标题】:System.ObjectDisposedException when trying to access DataContext尝试访问 DataContext 时出现 System.ObjectDisposedException
【发布时间】:2021-12-11 20:47:15
【问题描述】:

我正在尝试使用 DbContext 从存储库中获取一些数据。出于某种原因,我不断收到 System.ObjectDisposedException。在我的整个代码中,我没有处理任何东西,也没有在相关类中使用 using 语句。 这是引发异常的方法示例,尽管此存储库中的所有方法都会发生这种情况。

public async Task<List<Unternm>> GetCompanyBaseDataAsync(List<int> companyKeys)
{
      return await _context.Set<Unternm>().Where(u => companyKeys.Contains(u.Baseid)).ToListAsync();
}

DB Context 是这样注入的:

 public class MasterDataRepository : IMasterDataRepository
  {
    private readonly IMapper _mapper;
    private static IDataContext _context;
    public MasterDataRepository(IMapper mapper, IDataContext context)
    {
      _mapper = mapper;
      _context = context;
    }

这是我的数据上下文的样子:

  public class DataContext : DbContext, IDataContext
  {

    public DataContext(DbContextOptions options) : base(options)
    {
      
    }

    public DbSet<Arztlfd> Arztlfd { get; set; }
    public DbSet<Arztstam> Arztstam { get; set; }
    public DbSet<Oposten> Oposten { get; set; }
    public DbSet<Unternm> Unternehmen { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
       optionsBuilder.UseNpgsql(...);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
     ...
    }

这是我得到的例外:

无法访问已释放的上下文实例。此错误的一个常见原因是释放从依赖注入中解析的上下文实例,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。 对象名称:'DataContext'。

请问有人可以帮忙吗? 提前致谢。

【问题讨论】:

  • DbContext 注入了吗?你从哪里调用你的GetCompanyBaseDataAsync 方法?
  • 我正在从这样的服务调用方法:var result = await _masterDataRepository.GetCompanyBaseDataAsync(companyKeys);

标签: c# .net-core repository datacontext objectdisposedexception


【解决方案1】:

删除存储库中的静态。这是一个错误。 您必须像这样将 DI 添加到您的启动中

services.AddDbContext<DataContext>(options => {
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"));

否则你将不得不手动创建它

 private DataContext _context= new DataContext();

【讨论】:

  • 感谢您的回答。我删除了静态,但它仍然无法正常工作。不,我像你说的那样手动创建它
  • 像你说的那样创建它更好还是我应该使用:await using var context = new DataContext() ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
相关资源
最近更新 更多