为数据库项目创建自定义功能

可以通过添加自己的功能来扩展现有数据库项目类型。 例如,可以创建一个功能,使之在每次加载或保存数据库项目时执行某些操作。 还可以创建自己的数据库架构提供程序和支持项目系统。 然而,本文不涉及这种类型的扩展性。

常规任务

常规任务

支持内容

了解有关扩展点的更多信息:可以了解数据库项目扩展性的设计。

  • 项目扩展性的目标

  • 组件模型程序集

  • 扩展点

  • 数据库项目生命周期

  • 错误管理

创建示例项目功能:了解创建一个自定义项目功能所需的步骤,该功能在加载数据库项目时显示对话框。 如果您执行这些演练,则将:

  • 创建一个 Visual Studio 包。

  • 自定义该包,以创建一个数据库项目功能。

  • 生成、安装并测试新项目功能。

安装自定义项目功能:在创建并生成项目功能后,必须先进行安装,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 的功能、编辑器和工具窗口的附属程序集。

扩展点

可以扩展数据库项目系统的以下点:

数据库项目生命周期

每个数据库项目文件 (.dbproj) 都包含一个名为“DSP”的属性,该属性指示在 Visual Studio 中打开此项目时将对此项目进行处理的特定 DatabaseSchemaProvider。 项目系统使用此 DSP 创建一个扩展管理器,并从其构造所有项目系统参与者和项目功能。 每个功能都接收一个 Initialize 事件,以便能够通过侦听事件将自身初始化并根植于项目系统中。

在项目打开/关闭和保存过程中会引发以下事件:

  • NewProjectCreated
    此事件在第一次创建项目时发生。 可以处理此事件,以显示向导或设置对话框。

  • ProjectOpening
    项目正在打开。 可以处理此事件,以将任何服务添加到 IDatabaseProjectNode。

  • ProjectOpened
    此事件在添加了所有服务且项目已完成打开时发生。 然而,项目此时尚未完成对其上一个状态的反序列化。 TaskHostDataSchemaModel 一直为 NULL,直至发送 ProjectLoaded 事件。

  • ProjectLoaded
    项目已完全加载。 TaskHostDataSchemaModel 已可供使用。

  • ProjectClosing
    项目正在关闭。 这是保存处于项目文件之外的任何状态信息的好机会。

  • ProjectClosed
    项目已关闭。

  • ProjectSaving
    项目正在执行保存操作。 可以此为契机,确保功能处于可存储其持久性的状态。

  • ProjectSaved
    项目已保存。

错误管理

每个项目都有一个 ErrorManager。 有些错误会保存到 .dbmdl 文件中,而有些错误不会。 这可以通过 AddPersistedCategory 类进行控制。 默认情况下,会保存以下类别:ModelCategoryValidationAtBuildCategoryValidationOnIdleCategory。 如果您添加另一个保存的类别,则必须处理项目重新加载,并验证和管理您的错误。 请记住,虽然项目已关闭,但是用户可能编辑了 .dbproj 文件,以致移除了您为之报告错误的文件。 这会令用户感到十分困惑:既然不存在这样的文件,为何还要报告项目中的错误。

数据库错误对象会添加到 ErrorManager 中的特定类别中。 这样做的原理是,项目功能可以通过其类别的生存期来管理其错误的生存期。 如果您担心类别名称与其他功能冲突,请将 GUID 用作名称。 ErrorManager 定义几个内置类别,包括:

  • DefaultCategory
    此类别旨在供您用于生存期等于项目生存期的错误。 因此,举例来说,在项目加载过程中发生的一些错误会添加到此类别。

  • ModelCategory
    此类别应由架构管理器在遇到分析器错误之类的错误时使用。

相关方案

创建自定义数据库重构类型或目标

创建和注册用于分析数据库代码的其他规则

用自定义数据生成器生成专用的测试数据

定义数据库单元测试的自定义条件

使用生成参与者和部署参与者自定义数据库生成和部署

请参见

概念

扩展 Visual Studio 的数据库功能