gpt4 book ai didi

c# - 如何将 EDMX 嵌入 Code First 程序集中?

转载 作者:行者123 更新时间:2023-11-30 16:59:39 29 4
gpt4 key购买 nike

我们在 EF6.1 中使用 Code First - 我们的模型现在有超过 300 个表,启动时间很长。我们已经尝试过预生成 View ,但没有太大帮助,大部分时间是 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 集成目标完成的,因此模板始终在项目构建期间运行。

最佳答案

您当然应该能够使用 MSBuild 执行此操作。您将需要学习一些构建脚本,但应该不会太差。

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

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

按照复杂性递增的顺序,您可以:

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

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

关于c# - 如何将 EDMX 嵌入 Code First 程序集中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23496313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com