我正在做ASP。Net Core 2.0项目使用实体框架核心

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.1" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0"/>

在我的一个列表方法中,我得到了这个错误:

InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.
Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()

这是我的方法:

    [HttpGet("{currentPage}/{pageSize}/")]
    [HttpGet("{currentPage}/{pageSize}/{search}")]
    public ListResponseVM<ClientVM> GetClients([FromRoute] int currentPage, int pageSize, string search)
    {
        var resp = new ListResponseVM<ClientVM>();
        var items = _context.Clients
            .Include(i => i.Contacts)
            .Include(i => i.Addresses)
            .Include("ClientObjectives.Objective")
            .Include(i => i.Urls)
            .Include(i => i.Users)
            .Where(p => string.IsNullOrEmpty(search) || p.CompanyName.Contains(search))
            .OrderBy(p => p.CompanyName)
            .ToPagedList(pageSize, currentPage);

        resp.NumberOfPages = items.TotalPage;

        foreach (var item in items)
        {
            var client = _mapper.Map<ClientVM>(item);

            client.Addresses = new List<AddressVM>();
            foreach (var addr in item.Addresses)
            {
                var address = _mapper.Map<AddressVM>(addr);
                address.CountryCode = addr.CountryId;
                client.Addresses.Add(address);
            }

            client.Contacts = item.Contacts.Select(p => _mapper.Map<ContactVM>(p)).ToList();
            client.Urls = item.Urls.Select(p => _mapper.Map<ClientUrlVM>(p)).ToList();
            client.Objectives = item.Objectives.Select(p => _mapper.Map<ObjectiveVM>(p)).ToList();
            resp.Items.Add(client);
        }

        return resp;
    }

我有点迷失,特别是因为当我在本地运行它时,它可以工作,但当我部署到我的登台服务器(IIS 8.5)时,它会给我这个错误,并且它正常工作。在我增加了其中一个模型的最大长度后,错误开始出现。我还更新了相应视图模型的最大长度。还有很多类似的列表方法,它们都很有效。

我有一个正在运行的Hangfire作业,但这个作业不使用相同的实体。这就是我能想到的所有相关信息。知道是什么引起的吗?


当前回答

我也有同样的问题,结果发现父母服务是一个单一的。所以context也自动变成了singelton。尽管在DI中被声明为每生命时间范围。

将具有不同生命周期的服务注入到另一个服务中

不要将作用域和瞬态服务注入到单例服务中。( 这有效地将瞬态或作用域服务转换为 单例)。 永远不要将瞬态服务注入到作用域服务中(这会转换 将瞬态服务放入作用域。)

其他回答

有一些Async函数,但是你没有在它之前调用await。在调用该函数之前查找并添加await将对您有所帮助。

我知道这个问题在两年前就被问到过,但我刚刚遇到过这个问题,我使用的修复程序真的很有帮助。

如果你用同一个Context做两个查询,你可能需要删除AsNoTracking。如果你使用AsNoTracking,你会为每次读取创建一个新的数据读取器。两个数据读取器不能读取相同的数据。

我也犯了同样的错误。发生这种情况是因为我调用了一个构造为公共异步void的方法…而不是公共async任务....

如果您创建了迁移(Add-Migration),但忘记实际更新数据库(update - database),也可能出现此错误。

使用Startup.cs文件中的这行代码解决我的问题。 添加瞬态服务意味着每次请求该服务时,都会在您工作时创建一个新实例 与 依赖注入 服务。AddDbContext > <上下文(选项= > options.UseSqlServer (_configuration.GetConnectionString(“ContextConn”)), ServiceLifetime.Transient);