65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 PowerShell 脚本动态生成实体类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (2投票s)

2011 年 8 月 6 日

CPOL

3分钟阅读

viewsIcon

22715

downloadIcon

142

展示了如何通过从 PowerShell 脚本调用实用程序来生成实体类

引言

LINQ to SQL是.NET Framework 3.5版本的一个组件,它提供一个运行时基础设施,用于将关系数据作为对象进行管理。使用Visual Studio的开发者通常使用对象关系设计器,该设计器提供一个用户界面来实现LINQ to SQL的许多功能;然而,有时大型数据库可能需要一些时间来生成,如果您的.NET项目包含大量需要构建的文件和解决方案;当存在分布式开发团队时,这实际上可能是构建过程的一部分。

背景

为了演示目的,我将使用

开始之前

假设您之前已安装AdventureWorks2008,请继续并将AdventureWorks_Data.mdf复制到任何文件夹进行测试。我使用的是C:\adw\AdventureWorks_Data.mdf。在复制之前,您可能需要停止SQL服务。

Using the Code

SqlMetal命令行工具为.NET Framework的LINQ to SQL组件生成代码和映射。

通过应用选项,您可以指示SqlMetal执行几个不同的操作,其中包括以下内容

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

通常安装在C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin

这种方法适用于大型数据库,也许您也可以在构建过程中发现它很有用。

SQLMetal文件包含在与Visual Studio一起安装的Windows SDK中。

命令语法如下所示

sqlmetal [options] [path]

要查看最新的选项列表,请从安装位置的命令提示符处键入sqlmetal /?。目前有四种选项类型:连接提取输出杂项

关注点

确保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。

当然,为了在构建过程中使用该文件,还必须对其进行其他一些小的调整;但这是另一篇文章的主题!

来源: http://msdn.microsoft.com/en-us/library/bb386987.aspx

致谢

所做的更正是由Mark推荐的。感谢Mark的建议。

历史

  • 2011 年 8 月 4 日:初始版本
© . All rights reserved.