在.NET框架中,LINQ to SQL提供了一种方便的方式来操作关系型数据库,它允许开发者以面向对象的方式处理数据。Visual Studio中的Object Relational Designer为用户提供了实现LINQ to SQL特性的图形界面。然而,在处理大型数据库时,生成过程可能会耗费较长时间,尤其是当.NET项目包含大量文件和解决方案需要构建,或者在分布式开发团队中,这可能会成为构建过程的一部分。
本文将演示如何使用以下工具:
在开始之前,请确保已经安装了AdventureWorks2008数据库,并将AdventureWorks_Data.mdf文件复制到测试文件夹中,例如C:\adw\AdventureWorks_Data.mdf。复制之前,可能需要停止SQL服务。
SqlMetal命令行工具可以为.NET框架的LINQ to SQL组件生成代码和映射。通过应用选项,可以指示SqlMetal执行多种不同的操作,包括:
SqlMetal通常安装在C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin路径下。这种方法适用于大型数据库,并且可能会在构建过程中发现它很有用。
SqlMetal文件包含在与Visual Studio一起安装的Windows SDK中。命令语法如下:
sqlmetal [options] [path]
要查看当前选项列表,请在安装位置的命令提示符中输入:
sqlmetal /?
目前有四种类型的选项:连接(Connection)、提取(Extraction)、输出(Output)和杂项(Miscellaneous)。
确保SqlMetal工作正常,只需运行命令并指向包含*.mdf文件的文件夹即可;如下所示。在Visual Studio命令提示符(2010)中,输入如下命令:
sqlmetal /code:"c:\adw\AdventureWorks.cs" /language:csharp "C:\adw\AdventureWorks_Data.mdf"
结果应该是一个C#代码文件,但可以使用/language:vb指定VB。
生成的对象模型应该如下所示:
现在已经成功生成了对象模型,接下来创建一个支持序列化的对象模型。
sqlmetal /code:"c:\adw\SerialAdventureWorks.cs" /language:csharp /serialization:Unidirectional "C:\adw\AdventureWorks_Data.mdf"
现在有另一个支持序列化的对象。显然,当支持序列化时,构建时间会更长,生成的代码类文件大小也会更大。
这两个文件之间几乎有100kb的差异!此外,如果想生成*.dbml文件,可以通过运行以下命令来实现:
sqlmetal /dbml:"c:\adw\AdventureWorks.dbml" /language:csharp /serialization:Unidirectional "C:\adw\AdventureWorks_Data.mdf"
还可以生成视图、函数和存储过程,但必须在命令参数中指明。
将展示如何使用PowerShell脚本来实现这一点。
为此,将使用cmdlet。
Cmdlet概述:
Cmdlet是一个轻量级命令,用于Windows PowerShell环境。Windows PowerShell运行时在命令行提供的自动化脚本上下文中调用这些cmdlet。Windows PowerShell运行时还通过Windows PowerShell API以编程方式调用它们。
在PowerShell编辑器中的命令应该如下所示:
$FrameworkPath = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319"
$SDKPath = "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin"
invoke-expression "& '$SDKPath\sqlmetal.exe' '/code:c:\adw\AdventureWorks.cs'
'/language:csharp' 'C:\adw\AdventureWorks_Data.mdf' '/namespace:AdventureWorks.Database'
'/views' '/functions' '/sprocs' '/serialization:Unidirectional'"
这个*.PS1文件生成另一个包含所有特性的类,包括存储过程、视图、函数等:
如所见,类文件越来越大,最终大小为759。
当然,为了在构建过程中使用这个文件,还需要进行一些较小的调整;但这将是另一篇文章的内容!