使用SqlMetal工具和PowerShell脚本生成LINQ to SQL对象模型

在.NET框架中,LINQ to SQL提供了一种方便的方式来操作关系型数据库,它允许开发者以面向对象的方式处理数据。Visual Studio中的Object Relational Designer为用户提供了实现LINQ to SQL特性的图形界面。然而,在处理大型数据库时,生成过程可能会耗费较长时间,尤其是当.NET项目包含大量文件和解决方案需要构建,或者在分布式开发团队中,这可能会成为构建过程的一部分。

本文将演示如何使用以下工具:

  • PowerShell命令执行脚本
  • SqlMetal命令行工具
  • AdventureWorks2008数据库

在开始之前,请确保已经安装了AdventureWorks2008数据库,并将AdventureWorks_Data.mdf文件复制到测试文件夹中,例如C:\adw\AdventureWorks_Data.mdf。复制之前,可能需要停止SQL服务。

使用代码

SqlMetal命令行工具可以为.NET框架的LINQ to SQL组件生成代码和映射。通过应用选项,可以指示SqlMetal执行多种不同的操作,包括:

  • 从数据库生成源代码和映射属性或映射文件。
  • 从数据库生成中间数据库标记语言(.dbml)文件以进行定制。
  • 从.dbml文件生成代码和映射属性或映射文件。

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。

当然,为了在构建过程中使用这个文件,还需要进行一些较小的调整;但这将是另一篇文章的内容!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485