如何在分布式缓存中缓存DbCompiledModel(或仅缓存其元数据)

时间:2012-06-12 10:14:41

标签: wcf caching entity-framework-4.1 distributed-caching

我使用大型dbContext(800多个实体)处理Entity Framework Code First项目。

我遇到的问题是,第一次构建和编译元数据需要30秒,我无法让所有服务器服务器以这种方式延迟第一个请求(WCF),即使借助于AppFabric WarmUp模块。 一个选项是将已编译的模型缓存在分布式缓存上,因此在实例化DbContext时,服务器场中的其他服务器可以利用已存在的模型。

我发现了一些事情:

  • 无法序列化DbCompiledModel实例;
  • DbCompiledModel使用'ICachedMetadataWorkspace'的实现来缓存其元数据,称为'CodeFirstCachedMetadataWorkspace';
  • 'CodeFirstCachedMetadataWorkspace'(甚至'ICachedMetadataWorkspace')确实可用于提供可序列化的工作空间(以及'DbDatabaseMapping.ToMetadataWorkspace'方法的帮助),该工作空间将作为xml存储在分布式缓存中;

不幸的是,所有提到的类型都被EF Code First定义为内部类型(当然DbCompiledModel除外),直到现在我找不到合适的方法来将其缓存出来。

我尝试的另一件事是拥有一个自定义的ObjectContext(在DbContext构造函数中使用它)在哪里编程生成/加载csdl,ssdl和msl映射(来自db模式),但是实际的视图(poco类) )仍然保持未映射到整个数据库上下文。

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

试试Arthur Vickers在EF团队发布的这篇博文:http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/

它具体说明了如何缓存已编译的模型。