我在一个带有大型 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 类)仍然存在未映射到整个数据库上下文。
任何帮助深表感谢。
谢谢。