如何:预生成视图以提高查询性能

在实体框架 可以针对概念模型执行查询或将更改保存到数据源之前,它必须生成一组本地查询视图才能访问数据库。视图属于每个应用程序域缓存的元数据的一部分。如果您在同一个应用程序域中创建了多个对象上下文实例,则这些实例将重用缓存元数据中的视图,而不是重新生成视图。视图生成是执行单个查询的总开销的重要部分,因此实体框架 让您可以预生成这些视图并在已编译项目中包含这些视图。有关更多信息,请参见性能注意事项(实体框架)

除了生成和验证实体框架模型和映射文件以外,EDM 生成器 (EdmGen.exe) 工具还用于预生成这些视图。本主题演示如何使用 EdmGen.exe 预生成 School 模型的视图,并将视图文件添加到项目。School 模型是在 实体框架 快速入门中创建的。最后的过程向您演示如何将模型和映射文件作为嵌入的资源重新添加到一个 ASP.NET Web 应用程序。

还可以使用文本模板转换工具包生成预编译的视图。有关更多信息,请参见如何使用 T4 模板生成视图(可能为英文页面)。

Bb896240.note(zh-cn,VS.100).gif注意:
本主题中的过程使用 Visual Studio 中的预生成和生成后事件,在 ASP.NET 网站中不支持这些事件。若要预生成 ASP.NET 网站使用的视图,请在单独的类库中创建 .edmx 文件,对类库项目使用How to: Use a Model Defined in a Class Library中的过程,并在 ASP.NET 网站项目中引用该类库项目。或者,可考虑使用 ASP.NET Web 应用程序项目而不是 ASP.NET 网站。这使您可以通过使用本主题中的过程,在与 ASP.NET Web 应用程序相同的项目中包含预生成的视图。

预生成的视图在运行时进行验证,以确保这些视图与模型和映射文件的当前版本保持一致。

本主题中的过程使用 School 模型。可以通过完成快速入门(实体框架) 生成此模型。如果生成过程正在输出目录中生成模型和映射文件,则可以跳过第一个过程。

在输出目录中生成 School 模型的模型和映射文件

  1. 在**“解决方案资源管理器”**中,双击 School.edmx 文件。

    这会在**“实体设计器”**中显示 School 模型。

  2. 在**“模型浏览器”中,选择 SchoolModel 模型并将“元数据项目处理”更改为“复制到输出目录”**。

    这可确保在输出目录中生成模型和映射文件。

  3. 生成解决方案。

    这会在输出目录中生成模型和映射文件。

向 Visual Basic 项目添加视图生成

  1. 在**“解决方案资源管理器”**中,选择要为其指定生成事件的项目。

  2. 在**“项目”**菜单上,单击“项目属性”。

  3. 在**“属性”页中,单击“编译”**选项卡。

  4. 单击**“生成事件”**按钮。

  5. 在**“生成事件”**对话框中,添加下面的预生成事件(无换行符):

    "%windir%\Microsoft.NET\Framework\v4.0.30319\EdmGen.exe" /nologo /language:VB 
    /mode:ViewGeneration "/inssdl:$(TargetDir)School.ssdl" 
    "/incsdl:$(TargetDir)School.csdl" "/inmsl:$(TargetDir)School.msl" 
    "/outviews:$(ProjectDir)School.Views.vb"
    
  6. 单击**“确定”**。

  7. 关闭**“项目属性”**页。

  8. 生成解决方案。

    这会生成视图文件 School.Views.vb。

  9. 在**“解决方案资源管理器”中右键单击项目名称,并选择“添加现有项”**。

  10. 在**“添加现有项”**对话框中,导航至项目的根文件夹并选择 School.Views.vb 文件。

  11. 单击**“添加”**。

  12. 生成解决方案。

向 C# 项目添加视图生成

  1. 在**“解决方案资源管理器”**中,选择要为其指定生成事件的项目。

  2. 在**“项目”菜单上,单击“属性”**。

  3. 选择**“生成事件”**选项卡。

  4. 在**“预生成事件命令行”**窗口中,添加下面的预生成事件(无换行符):

    "%windir%\Microsoft.NET\Framework\v4.0.30319\EdmGen.exe" /nologo /language:CSharp 
    /mode:ViewGeneration "/inssdl:$(TargetDir)School.ssdl" 
    "/incsdl:$(TargetDir)School.csdl" "/inmsl:$(TargetDir)School.msl" 
    "/outviews:$(ProjectDir)School.Views.cs"
    
  5. 生成解决方案。

    这将生成视图文件 School.Views.cs。

  6. 在**“解决方案资源管理器”中右键单击项目名称,并选择“添加现有项”**。

    出现**“添加现有项”**对话框。

  7. 导航至项目的根文件夹并选择 School.Views.cs 文件。

  8. 单击**“添加”**。

  9. 生成解决方案。

将映射和模型文件重新添加为 ASP.NET 项目的嵌入资源

  1. 在**“项目”菜单上单击“添加现有项”**。

  2. 浏览至项目的输出目录,选择 School.csdl,然后单击**“确定”**。

  3. 在**“解决方案资源管理器”**中选择添加的文件。

  4. 在**“属性”中,将“生成操作”设置为“嵌入的资源”**。

  5. 对 School.ssdl 文件和 School.msl 文件重复步骤 1 至 3。

  6. 在**“解决方案资源管理器”**中,双击 App.config 文件,然后基于以下任一格式修改 connectionString 属性中的 Metadata 参数:

    • Metadata= res://<assemblyFullName>/<resourceName>;

    • Metadata= res://*/<resourceName>;

    • Metadata=res://*;

    resourceName 可以包括项目命名空间。有关更多信息,请参见连接字符串(实体框架)

另请参见

参考

EDM 生成器 (EdmGen.exe)

其他资源

Entity Data Model Tools
在 Entity Framework 4 中使用预编译或预生成的视图隔离性能