3

我们在 EF6.1 中使用 Code First - 我们的模型现在有 300 多个表,而且启动时间很荒谬。我们已经尝试过预生成视图,但并没有太大帮助,大部分时间是 Code First 管道中的模型编译。

我们将尝试使用数据库/模型优先的方法来初始化上下文,方法是使用带有指向 CSDL、SSDL 和 MDL 文件的元数据链接的实体连接字符串,而不是直接的 SQL 连接。这将是我们理想的过程:

  1. 编译包含 Code First 模型的项目后,将运行一个构建后任务,该任务从我们的 DbContext 生成一个 EDMX 文件,将其拆分为组件 CSDL、SSDL 和 MDL 文件,并将这些文件作为资源嵌入到程序集中
  2. 当我们通过自己的工厂创建上下文时,我们将原始 SQL 连接字符串包装在 EntityConnectionStringBuilder 中,其中 Metadata 属性指向嵌入式资源,并使用构建器连接字符串来初始化 DbContext

初始测试显示启动时间缩短了约 80% - 这里的棘手部分是在步骤 1 中进行构建后资源嵌入!

任何人都可以提供有关如何在 MSBuild 中完成第 1 步的任何线索吗?是否有其他可行的策略?基本上,我们想要一个零维护的解决方案,这样开发人员除了构建他们的代码之外不必手动做任何事情,也没有特殊的部署考虑。

编辑:

我们最终使用了一个新的、单独的类库项目,该项目引用了包含 Code First 模型的项目。该项目包含一个 T4 模板,它将 DbContext 中的 EDMX 写入内存,然后将组件部分保存到已标记为嵌入式资源的项目文件中,因此我们也获得了源代码控制。

构建顺序保证资源始终是最新的,并且实体连接字符串在运行时引用此资源程序集。MSBuild 集成是通过使用 T4 MSBuild 集成目标完成的,因此模板始终在项目构建期间运行。

4

1 回答 1

2

您当然应该能够使用 MSBuild 做到这一点。您将不得不拿起一点构建脚本,但应该不会太糟糕。

你现在怎么样了?您是否有运行以生成 edmx 的控制台应用程序?听起来您已经完成了困难的部分——与 MSBuild 集成应该很容易。我会假设你这样做,然后从那里开始。

顺便说一句:首先要知道的一件事是您的 .csproj 文件MSBuild 脚本,因此任何自定义 MSBuild 脚本都可以进入这些 csproj 文件。

为了增加复杂性,您可以:

  • 将“构建后”事件添加到执行控制台应用程序的项目中。此选项不需要任何 MSBuild 脚本——您只需在项目选项中设置构建后事件。不过,它会一直运行。(我认为您不能根据配置进行构建后事件),因此它可能会减慢您的编译时间。
  • 您可以使用 MSBuild 中的Exec任务来执行控制台应用程序。这将需要对您的 csproj 文件进行一些编辑,但如果需要,您可以将其设置为有条件的。这是 Exec 任务的链接:http://msdn.microsoft.com/en-us/library/x8zx72cd.aspx 如果你把它放在一个名为“AfterBuild”的目标中,它会在你的构建完成后自动执行。
  • 您可以编写自己的构建任务——这是将在构建期间加载和执行的 ac# 类。这是最复杂的方法,但它也给你最大的控制权:http: //blogs.msdn.com/b/msbuild/archive/2006/01/21/515834.aspx

最后一个选项(自定义构建任务)的好处之一是您可以将错误消息写回到构建过程中。如果任务失败,这应该有助于获取有用的信息,并且如果您使用构建服务器,服务器应该以与任何其他构建消息相同的方式接收这些消息。

于 2014-05-06T16:08:35.083 回答