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
我使用 .NET Core 3.1 和 EF Core 3.1。我编写了一种方法,通过 Id
.
我的问题是,当我第一次获取数据时,没问题,但是当我再次获取相同的数据时,第二次,数据获取不正确并且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