EF 核心 6 结果与数据库不匹配



我执行一个查询,但并不总是得到相同的结果。

我使用断点一步一步地执行下面的代码片段。此代码的用例是等待某个进程不再繁忙后再继续执行。

  • .NET 6.0
  • EF Core 6.0.4
string slug = "abc";
Entity entity = await _resource.GetQueryable()
.Where(x => x.Slug == slug)
.FirstOrDefaultAsync();
// entity.IsBusy is true
int retries = 0;
while(entity.IsBusy)
{
if (retries > 10)
{
throw new SyncIsBusyException();
}
retries++;
// Now I manually execute an SQL query on the database.
// update Entities set IsBusy = 'false'
Thread.Sleep(3000);
entity = await _resource.GetQueryable()
.Where(x => x.Slug == slug)
.FirstOrDefaultAsync();
// entity.IsBusy is still true (not in the DB)
string test = await _resource.GetQueryable()
.Where(x => x.Slug == slug)
.Select(x => x.IsBusy)
.FirstOrDefaultAsync();
// test is false (which is correct)
// test if creating a new variable changes things
var test1 = await _resource.GetQueryable()
.Where(x => x.Slug == slug)
.FirstOrDefaultAsync();
// test1.IsBusy is true (which is again incorrect)
}

资源:

public virtual IQueryable<TEntity> GetQueryable()
{
var queryable = _dbContext.Set<TEntity>().AsQueryable();
return queryable;
}

它看起来像是某种缓存,但我没有任何设置。我还可以在控制台中看到正在执行的SQL查询。当我在DB上手动执行这个生成的SQL查询时,我会得到正确和预期的结果(IsBusy-false(。我可以通过在while之上添加一个bool isBusy = entity.IsBusy;然后使用它来修复这个错误。但我仍然想知道这里的根本问题。

Slug是您实体的主键吗?

除非清除本地缓存(dbContext.ChangeTracker.Clear()(或首先使用.AsNoTracking()查询,否则更改跟踪器将按其主键缓存实体。

后者确实阻止了对实体的更新。

Select查询投影实体的一个子集,以便对存储执行查询

最新更新