如何:预生成视图以改善查询性能(实体框架)

在可以对 实体数据模型 (EDM) 执行查询之前,实体框架 会生成一组用于访问数据库的视图。实体框架 在第一次执行查询时生成视图,然后在 ObjectContext 实例的生存期内维护这些视图。视图生成是执行单个查询的总开销的重要部分,因此 实体框架 让您可以预生成这些视图并在已编译项目中包含这些视图。除了生成和验证 EDM 映射和模型文件之外,EDM 生成器 (EdmGen.exe) 工具还用于预生成这些视图。本主题演示如何使用 EdmGen.exe 预生成 School 模型的视图,并将视图文件添加到项目。School 模型是在 实体框架 快速入门中创建的。最后的过程向您演示如何将模型和映射文件作为嵌入的资源重新添加到一个 ASP.NET Web 应用程序。

Note注意

本主题中的过程使用 Visual Studio 中的生成前和生成后事件,在 ASP.NET 网站中不支持这些事件。若要为 ASP.NET 网站所使用的一个 EDM 预生成视图,应在单独的类库中创建该 EDM,对该类库项目使用下面的过程,并在 ASP.NET 网站项目中引用该类库项目。或者,可考虑使用 ASP.NET Web 应用程序项目而不是 ASP.NET 网站。这使您可以通过使用本主题中的过程,在与 ASP.NET Web 应用程序相同的项目中包含预生成的视图。

预生成的视图在运行时进行验证,以确保这些视图与当前版本的 EDM 保持一致。此过程确保这些视图与 EDM 匹配。如果生成过程正在输出目录中生成模型和映射文件,则可以跳过第一个过程。本主题中的过程使用 School 模型。可以通过完成快速入门(实体框架) 生成此模型。

Note注意

执行本主题中的过程需要 Visual Studio 2008 Service Pack 1 (SP1)。

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

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

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

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

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

  3. 生成解决方案。

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

向 Visual Basic 项目添加视图生成

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

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

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

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

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

    "%windir%\Microsoft.NET\Framework\v3.5\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.cs。

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

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

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

  12. 生成解决方案。

向 C# 项目添加视图生成

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

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

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

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

    "%windir%\Microsoft.NET\Framework\v3.5\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)

其他资源

实体数据模型工具