Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save davidroth/9886349 to your computer and use it in GitHub Desktop.
Save davidroth/9886349 to your computer and use it in GitHub Desktop.
EntityFramwork DbConfiguration with custom DbModelStore for loading cached db models. The custom DbModelStore invalidates out-of-date cache files by comparing the last update date of the cache-xml to the update date of the domain assembly.
public class MyContextConfiguration : DbConfiguration
{
public MyContextConfiguration()
{
MyDbModelStore cachedDbModelStore = new MyDbModelStore(MyContext.EfCacheDirPath);
IDbDependencyResolver dependencyResolver = new SingletonDependencyResolver<DbModelStore>(cachedDbModelStore);
AddDependencyResolver(dependencyResolver);
}
private class MyDbModelStore : DefaultDbModelStore
{
public MyDbModelStore(string location)
: base(location)
{}
public override DbCompiledModel TryLoad(Type contextType)
{
string path = GetFilePath(contextType);
if(File.Exists(path))
{
DateTime lastWriteTime = File.GetLastWriteTimeUtc(path);
DateTime lastWriteTimeDomainAssembly = File.GetLastWriteTimeUtc(typeof(MyDomain.SomeTypeInOurDomain).Assembly.Location);
if (lastWriteTimeDomainAssembly > lastWriteTime)
{
File.Delete(path);
Tracers.EntityFramework.TraceInformation("Cached db model obsolete. Re-creating cached db model edmx.");
}
}
else
{
Tracers.EntityFramework.TraceInformation("No cached db model found. Creating cached db model edmx.");
}
return base.TryLoad(contextType);
}
}
}
@swax
Copy link

swax commented Mar 19, 2017

Hey thanks for this example, and thanks @j-Edge for getting this into EF 6.2, I hope it gets released soon! I forked this code and changed it so the model only invalidates when the hash of the model file has changed. This is so I can keep the cached file across rebuilds, branch changes, and asp deployments. Let me know what you think of this approach if you have time to take a look at it - Thanks!

@annguyen0505
Copy link

can u explain for me what is MyContext.EfCacheDirPath (i'm a beginer)

@sairfan1
Copy link

Hi, each time i run the application it rewrites .edmx files, that's why there is no luck, can you please advise what could be wrong? i debug the code and sure this line File.Delete(path); is not deleting the existing file. thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment