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

时间:2014-05-06 13:38:50

标签: c# entity-framework msbuild entity-framework-6.1

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

我们将尝试使用Database / Model First方法通过使用具有到CSDL,SSDL和MDL文件的元数据链接的实体连接字符串而不是直接SQL连接来初始化上下文。这将是我们理想的过程:

  1. 在编译包含Code First模型的项目之后,运行后构建任务,从DbContext生成EDMX文件,将其拆分为组件CSDL,SSDL和MDL文件,并将这些文件作为资源嵌入到程序集中< / LI>
  2. 当我们通过自己的工厂创建上下文时,我们将原始SQL连接字符串包装在EntityConnectionStringBuilder中,Metadata属性指向嵌入的资源,并使用构建器连接字符串初始化DbContext
  3. 初始测试显示启动时间缩短了约80% - 这里棘手的部分是在第1步中进行构建后资源嵌入!

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

    编辑:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

btw:首先要知道的是.csproj文件 MSBuild脚本,因此任何自定义MSBuild脚本都可以进入这些csproj文件。

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

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

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