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

Wcf 如何在分布式缓存中缓存DbCompiledModel(或仅其元数据),wcf,caching,entity-framework-4.1,distributed-caching,Wcf,Caching,Entity Framework 4.1,Distributed Caching,我使用大型dbContext(800多个实体)处理实体框架代码第一个项目 我遇到的问题是,第一次构建和编译元数据需要30秒,我无法承受所有服务器场服务器以这种方式延迟第一个请求(WCF),即使在AppFabric预热模块的帮助下也是如此。 一个选项是将编译后的模型缓存在分布式缓存上,这样服务器场中的其他服务器在实例化DbContext时就可以利用已经存在的模型 我发现了一些事情: 无法序列化DbCompiledModel实例 DbCompiledModel使用“ICachedMetadataW

我使用大型dbContext(800多个实体)处理实体框架代码第一个项目

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

我发现了一些事情:

  • 无法序列化DbCompiledModel实例
  • DbCompiledModel使用“ICachedMetadataWorkspace”的实现来缓存其元数据,称为“CodeFirstCachedMetadataWorkspace”
  • “CodeFirstCachedMetadataWorkspace”(甚至“ICachedMetadataWorkspace”)确实可以用来提供一个可序列化的工作区(以及“DbDatabaseMapping.ToMetadataWorkspace”方法的帮助),该工作区将作为xml存储在分布式缓存上
不幸的是,EF代码首先将所有提到的类型定义为内部类型(当然DbCompiledModel除外),直到现在,我还没有找到合适的方法将其缓存到进程之外

我尝试过的另一件事是使用定制的ObjectContext(在DbContext构造函数中使用),在这里编程生成/加载csdl、ssdl和msl映射(从db模式),但实际视图(poco类)仍然没有映射到整个db上下文

非常感谢您的帮助


谢谢。

试试亚瑟·维克斯在英孚团队发表的这篇博文:


它特别显示了如何缓存已编译的模型。

我已经尝试过了,不幸的是,一旦构建了ModelBuilder并编译了DbModel,生成的DbCompiledModel就无法序列化,以便传输到分布式缓存系统。它只能在创建它的同一AppDomain上使用/缓存。我已经这样指出了Arthur。如果能做到,他会知道的。另一方面,在运行时从模型创建一个EDMX(hack)怎么样。这就是XML。你可以移动它。但不确定在将其移动到导线上后,您将如何处理它。;)@JulieLerman这个
DbCompiledModel
是否可以序列化为JSON并保存为应用程序目录中的文件,然后在应用程序启动时反序列化?我已经在生成视图并将它们保存到XML文件中。缓存
DbCompiledModel
也可能有助于我最初的冷启动查询。这里可以做一些事情,但首先我想澄清问题是什么。通常,对于大型模型,视图生成要比创建实际模型花费更多的时间。所以我假设您一定已经在这里使用了预生成的视图。如果不是的话,那将是第一件要尝试的事情。您可以使用EF电动工具进行此操作。看看这篇文章的“生成视图”部分:我的想法是,我的模型中已经有800多个实体,而且对于一个大型项目团队来说,很难维护和同步POCO实体(EF 4.1代码优先)和预编译视图(因此需要运行时生成预编译视图)。而且由于app fabric分布式缓存已经就位(后端服务器的公共缓存),因此需要将预编译的视图发送到分布式缓存,这样每个服务器都可以接收它们并加快初始化时间。谢谢。我认为目前没有任何方法可以做到这一点。我不相信有一种方法可以提取运行时编译的视图,这样您就可以在其他任何地方使用它们,甚至可以访问MetadataWorkspace。使用序列化编译模型状态的能力在我们的积压工作中,但不在EF5中。感谢Arthur抽出时间。我将继续关注EF的发展,db编译模型的序列化是场上下文中主要的初始化时间减少。