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

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

实体框架 在第一次执行查询时生成视图,然后在 ObjectContext 实例的生存期内维护这些视图。视图生成是执行单个查询的总开销的重要部分,因此 实体框架 让您可以预生成这些视图并在已编译项目中包含这些视图。除了生成和验证 EDM 映射和模型文件之外,EDM 生成器 (EdmGen.exe) 工具还用于预生成这些视图。本主题演示如何使用 EdmGen.exe 预生成 School 模型的视图,并将视图文件添加到项目。School 模型是在 实体框架 快速入门中创建的。最后的过程向您演示如何将模型和映射文件作为嵌入的资源重新添加到一个 ASP.NET Web 应用程序。注意本主题中的过程使用 Visual Studio 中的生成前和生成后事件,在 ASP.NET 网站中不支持这些事件。若要为 ASP.NET 网站所使用的一个 EDM 预生成视图,应在单独的类库中创建该 EDM,对该类库项目使用下面的过程,并在 ASP.NET 网站项目中引用该类库项目。或者,可考虑使用 ASP.NET Web 应用程序项目而不是 ASP.NET 网站。这使您可以通过使用本主题中的过程,在与 ASP.NET Web 应用程序相同的项目中包含预生成的视图。预生成的视图在运行时进行验证,以确保这些视图与当前版本的 EDM 保持一致。此过程确保这些视图与 EDM 匹配。如果生成过程正在输出目录中生成模型和映射文件,则可以跳过第一个过程。本主题中的过程使用 School 模型。可以通过完成快速入门(实体框架) 生成此模型。注意执行本主题中的过程需要 Visual Studio 2008 Service Pack 1 (SP1)。在输出目录中生成 School 模型的模型和映射文件在“解决方案资源管理器”中,双击 School.edmx 文件。这会在“实体设计器”中显示 School 模型。在“模型浏览器”中,选择 SchoolModel 模型并将“元数据项目处理”更改为“复制到输出目录”。这可确保在输出目录中生成模型和映射文件。生成解决方案。这会在输出目录中生成模型和映射文件。向Visual Basic 项目添加视图生成在“解决方案资源管理器”中,选择要为其指定生成事件的项目。在“项目”菜单上,单击“项目属性”。在“属性”页中,单击“编译”选项卡。单击“生成事件”按钮。在“生成事件”对话框中,添加下面的预生成事件(无换行符): "%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" 单击“确定”。关闭“项目属性”页。生成解决方案。这将生成视图文件 School.Views.cs。在“解决方案资源管理器”中右键单击项目名称,并选择“添加现有项”。在“添加现有项”对话框中,导航至项目的根文件夹并选择 School.Views.vb 文件。单击“添加”。生成解决方案。向C# 项目添加视图生成在“解决方案资源管理器”中,选择要为其指定生成事件的项目。在“项目”菜单上,单击“属性”。选择“生成事件”选项卡。在“预生成事件命令行”窗口中,添加下面的预生成事件(无换行符): "%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" 生成解决方案。这将生成视图文件 School.Views.cs。在“解决方案资源管理器”中右键单击项目名称,并选择“添加现有项”。出现“添加现有项”对话框。导航至项目的根文件夹并选择 School.Views.cs 文件。单击“添加”。生成解决方案。将映射和模型文件重新添加为 ASP.NET 项目的嵌入资源在“项目”菜单上单击“添加现有项”。浏览至项目的输出目录,选择 School.csdl,然后单击“确定”。在“解决方案资源管理器”中选择添加的文件。在“属性”中,将“生成 *** 作”设置为“嵌入的资源”。对School.ssdl 文件和 School.msl 文件重复步骤 1 至 3。在“解决方案资源管理器”中,双击 App.config 文件,然后基于以下任一格式修改 connectionString 属性中的 Metadata 参数:Metadata=res:///Metadata=res://*/Metadata=res://*resourceName 可以包括项目命名空间。有关更多信息,请参见连接字符串(实体框架)。

ADO.NET是。NET与数据库互 *** 作的核心,而ADO.NET实体数据库则增强了。NET应用程序与数据库的互联能力,通过ADO.NET实体数据模型我们可以很方便的与底层数据库进行强类型的数据互 *** 作。大大的方便了设计人员,从而也提高了数据库 *** 作的安全性。

最近在使用到Silverlight的领域数据服务时遇到一个很特别的问题[在应用程序中的结果和数据库的结果不一样],经过反复的试验,终于找到了问题的根源,那就是ADO.NET实体数据模型依赖于实体键,它的查询会生成实体键的唯一结果集。

现在来看看具体的 *** 作过程和处理方式:

为了对数据库的表进行 *** 作,在数据库的视图中建立了一个连接两个原子表的

vw_DesksAndUsers

的视图,这个视图旨在为了连接已存在的User表和Desk的数据,于是我做了如下的T-SQL的视图,如下所示:

在SQL

Server

2008中得到的查询结果如下:

也就是说得到了预期的结果,[这一步很成功].接下来进行第二步。

第二步:新建一个Silverlight商业应用程序SilverlightDomainDb,在生成的项目中会支持WCF

RIA服务。这是对Silverlight领域服务的支持所必须的。

第三步:在Web项目中添加一个ADO.NET实体数据模型的新项,在向导中选择相应的数据库连接和数据表、视图及存储过程等,完成以后会生成相应的实体数据类型和上下文,并得到。edmx的模型图。如下所示:

根据Visual

Studio

2010的提示,它为我们生成了两个实体键:DeskId,IsPlaying(这是Desk表中的两个字段)现在重新生成项目。

第四步:根据实体模型添加Web领域服务项。(在这一步需要添加相应的表和元数据信息)

第五步:Silverlight项目中将数据源所在vw_DesksAndUsers

的Datagrid拖到Home.xaml中,完成、调试。并没有得到上面的结果,而是生成了如下的Datagrid:

经过仔细的观察,才发现原来是ADO.NET实体数据模型中的结果集依赖于实体键,也就是说Silverlight领域服务会根据实体键的唯一生成查询的结果集,于是就产生了上面的以DeskId为唯一键的数据。

处理:

根据以上的分析,要得到预期的结果,必须设置合适的实体键,为了不至于影响到底层的SQL数据库,我们只需要修改。edmx模型图中的的实体键即可(点击右键选中或不选中"实体键"):

现在重新生成项目并运行程序,程序得到了预期的结果。

Silverlight商业应用程序作为一个专为数据显示而生的模板,为数据库的呈现提供了友好的界面,由于其优化的数据库的处理方式使得我们在使用时不得不考虑一些它们之间的细微差别[由于在Visual

Studio中没能看到有LINQ生成的T-SQL查询语句,所以我也只是提供了一个简单的解决方案而已],我想其深层的原因在于LINQ查询中生成的T-SQL语句与数据库中的T-SQL语句不同而产生。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9952620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存