可以通过添加自己的功能来扩展现有数据库项目类型。 例如,可以创建一个功能,使之在每次加载或保存数据库项目时执行某些操作。 还可以创建自己的数据库架构提供程序和支持项目系统。 然而,本文不涉及这种类型的扩展性。
常规任务
| 常规任务 | 支持内容 | 
|---|---|
| 了解有关扩展点的更多信息:可以了解数据库项目扩展性的设计。 | 
 | 
| 创建示例项目功能:了解创建一个自定义项目功能所需的步骤,该功能在加载数据库项目时显示对话框。 如果您执行这些演练,则将: 
 | |
| 安装自定义项目功能:在创建并生成项目功能后,必须先进行安装,Visual Studio 才会识别该功能。 | 
项目扩展性的目标
Visual Studio 2010 中数据库项目扩展性功能的主要目标如下所示:
- 通过接口公开主要组件 
 此方法使用接口(而不是抽象类)使项目系统与架构模型保持一致。 一个具体类应实现多个接口。
- 功能由扩展性管理器创建 
 功能负责系统的主要部分,包括解决方案资源管理器、架构视图、项目升级以及项目属性。
- 功能可以进行扩展 
 功能可以使用扩展性管理器、XML 文件、注册表或其他方法提供该扩展性。
- 服务通过自有接口进行公开 
 DataPackage 实现 IServiceProvider。 功能之间的所有交互通信应通过这些级别的服务进行处理。 不应将功能公开为服务。 而应创建新接口(即包装类),然后将包装公开为服务。
- 事件驱动项目系统 
 DataPackage 和 ProjectNode() 提供一些事件,这些事件可使功能驱动项目系统。 此外,功能可以通过其服务接口提供事件。 在某些情况下,您可能决定使用委托。 若要决定使用哪个功能处理操作,请考虑使用功能可以基于优先级进行交互的事件方法。
- 不要依赖于侦听器的顺序 
 如果针对某事件的侦听器的顺序十分重要,请考虑创建一个 Pre 或 Post 事件,或考虑将优先级属性添加到从 EventArg 派生的类。
组件模型程序集
以下程序集提供 Visual Studio 中的数据库项目系统。
- Microsoft.VisualStudio.Data.Schema.Package.dll 
 基项目系统,提供功能引导和事件处理。 这包括数据库不可知的功能,如脚本。
- Microsoft.VisualStudio.Data.Schema.PackageUI.dll 
 数据库不可知的包的附属程序集。
- Microsoft.VisualStudio.Data.Schema.Package.Sql.dll 
 Visual Studio 的特定于 SQL Server 的功能、编辑器和工具窗口。
- Microsoft.VisualStudio.Data.Schema.Package.SqlUI.dll 
 特定于 SQL Server 的功能、编辑器和工具窗口的附属程序集。
扩展点
可以扩展数据库项目系统的以下点:
- IDatabaseProjectFeature (AllowMultipleExtensions =true) 
 这是项目系统的主扩展点。 功能旨在控制项目和提供帮助。 它们可以选择实现以下几个接口:IOleCommandTarget、IDatabaseProjectPriorityCommandTarget、IDatabaseProjectPropertyPageContributor、IDatabaseProjectExtenderContributor<TExtendee>、IDatabaseProjectAddNewItemParticipant、IDatabaseProjectIdleProcessor 和 IDatabaseProjectPartialProjectParticipant。
- IDatabaseProjectBuildActionContributor (AllowMultipleExtensions =false) 
 向项目系统中的可能生成操作列表提供 BuildAction 字符串。例如,SQL Server 项目系统提供 Predeploy 和 Postdeploy。
- IDatabaseProjectUserFileContributor (AllowMultipleExtensions =false) 
 指定应路由到 .user 文件的属性。
- IDatabaseSchemaViewController (AllowMultipleExtensions =false) 
 填充架构视图并响应来自该视图的事件。
- IDatabaseProjectFileUpgradeController (AllowMultipleExtensions =false) 
 将项目文件作为 XML 文档进行升级。 此过程在 Visual Studio 项目系统尝试通过项目工厂加载项目实例之前发生。
- IDatabaseProjectReferenceController (AllowMultipleExtensions = false) 
 控制项目引用
- IDatabaseProjectPartialProjectParticipant (AllowMultipleExtensions = true) 
 使功能可以筛选出不得作为分部项目导出的文件。
- IDatabaseProjectHelpKeywordProvider 
 提供在客户按 F1 时使用的项目系统帮助关键字。
数据库项目生命周期
每个数据库项目文件 (.dbproj) 都包含一个名为“DSP”的属性,该属性指示在 Visual Studio 中打开此项目时将对此项目进行处理的特定 DatabaseSchemaProvider。 项目系统使用此 DSP 创建一个扩展管理器,并从其构造所有项目系统参与者和项目功能。 每个功能都接收一个 Initialize 事件,以便能够通过侦听事件将自身初始化并根植于项目系统中。
在项目打开/关闭和保存过程中会引发以下事件:
- NewProjectCreated 
 此事件在第一次创建项目时发生。 可以处理此事件,以显示向导或设置对话框。
- ProjectOpening 
 项目正在打开。 可以处理此事件,以将任何服务添加到 IDatabaseProjectNode。
- ProjectOpened 
 此事件在添加了所有服务且项目已完成打开时发生。 然而,项目此时尚未完成对其上一个状态的反序列化。 TaskHost 和 DataSchemaModel 一直为 NULL,直至发送 ProjectLoaded 事件。
- ProjectLoaded 
 项目已完全加载。 TaskHost 和 DataSchemaModel 已可供使用。
- ProjectClosing 
 项目正在关闭。 这是保存处于项目文件之外的任何状态信息的好机会。
- ProjectClosed 
 项目已关闭。
- ProjectSaving 
 项目正在执行保存操作。 可以此为契机,确保功能处于可存储其持久性的状态。
- ProjectSaved 
 项目已保存。
错误管理
每个项目都有一个 ErrorManager。 有些错误会保存到 .dbmdl 文件中,而有些错误不会。 这可以通过 AddPersistedCategory 类进行控制。 默认情况下,会保存以下类别:ModelCategory、ValidationAtBuildCategory 和 ValidationOnIdleCategory。 如果您添加另一个保存的类别,则必须处理项目重新加载,并验证和管理您的错误。 请记住,虽然项目已关闭,但是用户可能编辑了 .dbproj 文件,以致移除了您为之报告错误的文件。 这会令用户感到十分困惑:既然不存在这样的文件,为何还要报告项目中的错误。
数据库错误对象会添加到 ErrorManager 中的特定类别中。 这样做的原理是,项目功能可以通过其类别的生存期来管理其错误的生存期。 如果您担心类别名称与其他功能冲突,请将 GUID 用作名称。 ErrorManager 定义几个内置类别,包括:
- DefaultCategory 
 此类别旨在供您用于生存期等于项目生存期的错误。 因此,举例来说,在项目加载过程中发生的一些错误会添加到此类别。
- ModelCategory 
 此类别应由架构管理器在遇到分析器错误之类的错误时使用。