EF Core 不会两次从数据库中获取数据

EF Core don't fetch data from database on twice time

我使用 .NET Core 3.1 和 EF Core 3.1。我编写了一种方法,通过 Id.

从 SQL 服务器数据库中获取一行

我的问题是,当我第一次获取数据时,没问题,但是当我再次获取相同的数据时,第二次,数据获取不正确并且returns a 变量数据而不是数据库行(请参阅我的代码中的注释)。

public async Task<AcademyStudent> GetItemAsync(Guid id)
{
    var a = await _context.AcademiesStudents
                          .SingleOrDefaultAsync(x => x.Id == id);

    // the value of property a.Mobile is "09123456789"

    // change Mobile property with other data
    a.Mobile = "0000";

    // fetch again data from db with same query
    var b = await _context.AcademiesStudents
                          .SingleOrDefaultAsync(x => x.Id == id);

    // but the value of b.Mobile is not "09123456789" but also is "0000". why!??? :(

    return b;
}

我的问题在哪里?以及如何解决?

那是因为 Entity Framework 跟踪实体及其变化。因此,一旦您将某些内容加载到上下文中,它就会 return 那。

您需要在查询中使用 .AsNoTracking()

await _context.AcademiesStudents
              .AsQueryable()
              .AsNoTracking()
              .SingleOrDefaultAsync(x => x.Id == id);

a和b指的是同一个数据对象。添加 AsNoTracking() efcore 以防止跟踪状态更改。

无论如何,我不建议两次击中 DB。如果那不仅仅是出于测试目的,我认为您还需要考虑您的实现逻辑。

首先:

// change Mobile property with other data
a.Mobile = "0000";

它自己什么都不做。您必须通过调用上下文的写入或更新函数将更改写入数据库。

其次:

    var b = await _context.AcademiesStudents
        .SingleOrDefaultAsync(x => x.Id == id);

做的完全一样
    var a = await _context.AcademiesStudents
        .SingleOrDefaultAsync(x => x.Id == id);

因为 lambda 表达式的意思是:“使用 Id 找到具有该 Id 的对象并将其放入 a。 如果要查询不同的对象,则必须查询不同的 Id。

HTH