Perhaps I am misunderstanding the caching that DbContext
and DbSet
does but I was under the impression that there was some caching that would go on. I'm seeing behavior that I wouldn't expect when I run the following code:
var ctx = CreateAContext(); var sampleEntityId = ctx.SampleEntities.Select(i => i.Id) .Single(i => i == 3); //Calls DB as expected var cachedEntityId = ctx.SampleEntities.Select(i => i.Id) .Single(i => i == 3); //Calls DB unexpectedly
What's going on here? I thought that part of what you get from DbSet
is that it would first check the local cache to see if that object exists before querying the database. Is there just some sort of configuration option I am missing here?
Each time you try to make a query, Entity Framework checks cache containing complied SQL statements to see if there is an already compiled statement it can re-use with parameters. If that statement is not found, Entity Framework has to compile C# query to Sql again.
Entity Framework has the following forms of caching built-in: Object caching – the ObjectStateManager built into an ObjectContext instance keeps track in memory of the objects that have been retrieved using that instance. This is also known as first-level cache.
The Cache: The memory cache is used by default.
Versions 6.0, 6.1, 6.2, and 6.3 are no longer supported. Although Entity Framework 6. x is still supported, it is no longer being developed and will only receive fixes for security issues.
What @emcas88 is trying to say is that EF will only check the cache when you use the .Find
method on DbSet
.
Using .Single
, .First
, .Where
, etc will not cache the results unless you are using second-level caching.
This is because the implementation of the extensor methods, use the Find method of the context
contextName.YourTableName.Find()
to verify first the cache. Hope it helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With