3

我在一个带有大型 dbContext(800 多个实体)的实体框架代码优先项目上工作。

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

我发现了一些事情:

  • DbCompiledModel 实例不能被序列化;
  • DbCompiledModel 使用“ICachedMetadataWorkspace”的实现来缓存其元数据,称为“CodeFirstCachedMetadataWorkspace”;
  • 'CodeFirstCachedMetadataWorkspace'(甚至是'ICachedMetadataWorkspace')确实可以用来提供一个可序列化的工作空间(在'DbDatabaseMapping.ToMetadataWorkspace'方法的帮助下),它作为xml存储在分布式缓存上;

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

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

任何帮助深表感谢。

谢谢。

4

1 回答 1

0

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

它专门展示了如何缓存已编译的模型。

于 2012-06-12T14:07:02.207 回答