Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Entity Framework 6.x not cache results?

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?

like image 311
Adam Modlin Avatar asked Feb 11 '14 16:02

Adam Modlin


People also ask

Does Entity Framework cache query results?

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.

Does Entity Framework cache data?

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.

Does EF core cache data by default?

The Cache: The memory cache is used by default.

Is Entity Framework 6 still supported?

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.


2 Answers

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.

like image 146
danludwig Avatar answered Oct 04 '22 05:10

danludwig


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.

like image 25
emcas88 Avatar answered Oct 04 '22 03:10

emcas88