Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cache Entity Framework data and track its changes?

What I want is pretty simple conceptually but I can't figure out how it would be best to implement such a thing.

In my web application I have services which access repositories which access EF which interacts with the SQL Server database. All of these are instanced once per web request.

I want to have an extra layer between the repositories and EF (or the services and the repositories?) which statically keeps track of objects being pulled from and pushed to the database.

The goal, assuming DB-access is only accomplished through the application, would be that we know for a fact that unless some repository access EF and commits a change, the object set didn't really change.

An example would be:

Repository invokes method GetAllCarrots();

GetAllCarrots() performs a query on SQL Server retrieving a List<Carrot>, if nothing else happens in between, I would like to prevent this query from being actually made on the SQL Server each time (regardless of it being on a different web request, I want to be able to handle that scenario)

Now, if a call to BuyCarrot() adds a Carrot to the table, then I want that to invalidate the static cache for Carrots, which would make GetAllCarrots(); require a query to the database once again.

What are some good resources on database caching?

like image 535
bevacqua Avatar asked Oct 23 '22 06:10

bevacqua


1 Answers

You can use LinqToCache for this.

It allows you to use the following code inside your repository:

var queryTags = from t in ctx.Tags select t;
var tags = queryTags.AsCached("Tags");
foreach (Tag t in tags)
{
  ...
}

The idea is that you use SqlDependency to be notified when the result of a query changes. As long as the result doesn't change you can cache it.

LinqToCache keeps track of your queries and returns the cached data when queried. When a notification is received from SqlServer the cache is reset.

like image 124
Wouter de Kort Avatar answered Oct 26 '22 18:10

Wouter de Kort