繁体   English   中英

如何在Code First程序集中嵌入EDMX?

[英]How to embed EDMX in a Code First assembly?

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

我们将尝试使用Database / Model 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模板,它将EDMX从DbContext写入内存,然后将组件部分保存到已标记为嵌入资源的项目文件中,因此我们也获得了源代码控制。

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

您当然可以使用MSBuild执行此操作。 你将不得不拿起一些构建脚本,但不应该太糟糕。

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

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

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

  • 将“After build”事件添加到执行控制台应用程序的项目中。 此选项不需要任何MSBuild脚本 - 您只需在项目选项中设置After build事件。 但它总会运行。 (我认为你不能使后期构建事件依赖于配置),因此它可能会减慢编译时间。
  • 您可以使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM