我们在 EF6.1 中使用 Code First - 我们的模型现在有 300 多个表,而且启动时间很荒谬。我们已经尝试过预生成视图,但并没有太大帮助,大部分时间是 Code First 管道中的模型编译。
我们将尝试使用数据库/模型优先的方法来初始化上下文,方法是使用带有指向 CSDL、SSDL 和 MDL 文件的元数据链接的实体连接字符串,而不是直接的 SQL 连接。这将是我们理想的过程:
- 编译包含 Code First 模型的项目后,将运行一个构建后任务,该任务从我们的 DbContext 生成一个 EDMX 文件,将其拆分为组件 CSDL、SSDL 和 MDL 文件,并将这些文件作为资源嵌入到程序集中
- 当我们通过自己的工厂创建上下文时,我们将原始 SQL 连接字符串包装在 EntityConnectionStringBuilder 中,其中 Metadata 属性指向嵌入式资源,并使用构建器连接字符串来初始化 DbContext
初始测试显示启动时间缩短了约 80% - 这里的棘手部分是在步骤 1 中进行构建后资源嵌入!
任何人都可以提供有关如何在 MSBuild 中完成第 1 步的任何线索吗?是否有其他可行的策略?基本上,我们想要一个零维护的解决方案,这样开发人员除了构建他们的代码之外不必手动做任何事情,也没有特殊的部署考虑。
编辑:
我们最终使用了一个新的、单独的类库项目,该项目引用了包含 Code First 模型的项目。该项目包含一个 T4 模板,它将 DbContext 中的 EDMX 写入内存,然后将组件部分保存到已标记为嵌入式资源的项目文件中,因此我们也获得了源代码控制。
构建顺序保证资源始终是最新的,并且实体连接字符串在运行时引用此资源程序集。MSBuild 集成是通过使用 T4 MSBuild 集成目标完成的,因此模板始终在项目构建期间运行。