问题
I have a strange issue, which I haven't experienced before. I use Entity Framework to retrieve my records.
I have the following call:
var dbOrganisation = repository.DbOrganisation.FirstOrDefault(c => c.Id == id);
I expect no caching of this call. So when I make this call, I expect it to query the database and retrieve the latest DbOrganisation
object. But that is not what happens.
I call this method relatively two times relatively short time after eachother (~5-10 seconds). But in this period, a decimal value in this table, can be changed by some third party.
However, even though the value changes, the FirstOrDefault
call retrieves the not updated version.
Example situation:
- I make the
FirstOrDefault
call, and see the decimal value of the fieldCredits
, is 50 - A third party changes the
Credits
to 45 - I make the
FirstOrDefault
call 10 seconds, later, but theDbOrganisation
still have 50 in Credits
What am i doing wrong? I thought the FirstOrDefault
call was not cached by default?
回答1:
You doing everything correct, that's just how EF works.
You can use .AsNoTracking()
for you purposes:
var dbOrganisation = repository.DbOrganisation.AsNoTracking().FirstOrDefault(c => c.Id == id);
DbExtensions.AsNoTracking Method: Returns a new query where the entities returned will not be cached in the DbContext or ObjectContext.
来源:https://stackoverflow.com/questions/24340207/firstordefault-call-in-entity-framework-is-cached-but-database-is-changed