Estender os recursos de banco de dados de Visual Studio

Você pode estender Visual Studio Premium ou Visual Studio Ultimate , criando as extensões de recurso. Essas extensões de recurso permitem estender os recursos do Visual Studio Premium ou Visual Studio Ultimate , como refatoração, geração de dados, testes de unidade e análise de código do banco de dados. Quando você criar extensões de recurso, você está usando uma estrutura existente para o recurso de base, portanto, a quantidade de código que você precisa escrever é bastante reduzida.

Extensões do recurso têm pontos de extensibilidade bem definida. Não é necessário ter o SDK do Visual Studio criar extensões de recurso para Visual Studio Premium ou Visual Studio Ultimate.

Tarefas comuns de alto nível

Tarefas de alto nível

Conteúdo de apoio

Conheça os conceitos de extensibilidade do banco de dados: Antes de estender esses recursos, você deve entender como funciona a extensibilidade Visual Studio Premium ou Visual Studio Ultimate. Um provedor de esquema do banco de dados implementa todos os serviços que são específicos para uma determinada marca e a versão de um banco de dados (como SQL Server 2008). Isso inclui o analisador que lê e grava os scripts de banco de dados; o O modelo de objeto de domínio do Script (Script DOM) que representa os scripts; e o O modelo de esquema que modela os objetos, relacionamentos e propriedades da os objetos de banco de dados. Em Visual Studio Premium ou Visual Studio Ultimate, sempre que você interagir com um recurso ou a extensão do recurso, os recursos de extensões de recurso operam em alguma combinação dos serviços DSP, o Script DOM e o modelo de esquema.

  • Um banco de dados de modelagem.

  • Componentes de extensibilidade no Database Edition

  • Tipos de extensões de recurso

  • Componentes principais dos provedores de esquema do banco de dados

Adicione suporte para novos tipos de refatoração de banco de dados: Você pode criar extensões de recurso para a refatoração de banco de dados para permitir que novos tipos de refatoração de banco de dados. Cada novo tipo de refatoração também requer um ou mais colaboradores refatoração novos.

Adicione suporte para novos destinos de refatoração de banco de dados: Você pode ativar um tipo existente de refatoração para atualizar um novo tipo de artefato, como, por exemplo, um arquivo de texto ou a saída de um aplicativo de terceiros que contém informações de banco de dados do banco de dados. Se você criar um novo tipo de refatoração, você deve implementar um ou mais colaboradores refatoração para habilitar esse tipo operar em artefatos que estão contidos no seu o projeto de banco de dados.

Defina regras de análise de código do novo banco de dados: Você pode definir novas regras de análise de código de banco de dados que procuram problemas que não são detectados pelas regras que estão incluídas no Visual Studio Premium ou Visual Studio Ultimate.

Crie os geradores de dados personalizados: Geradores de dados personalizados podem ser usados para gerar dados de teste realista não divulgar informações confidenciais. Você pode criar os geradores de dados personalizados para complementar os geradores de dados que estão contidos no Visual Studio Premium ou Visual Studio Ultimate.

Adicione condições de teste de unidade de banco de dados personalizado: Definindo uma condição de teste personalizada, você pode verificar o comportamento de um objeto de banco de dados de maneiras que não suportam as condições de teste de unidade interna.

Personalize o comportamento de projeto de banco de dados: Definindo um recurso de projeto de banco de dados personalizado, você pode modificar o comportamento de projeto de maneiras que não suportam os projetos de banco de dados interno.

Um banco de dados de modelagem.

Para um banco de dados de modelo Visual Studio modela os scripts que compõem o Data Definition Language (DDL) de banco de dados e o banco de dados resultaria se você executou a esses scripts. O modelo dos scripts de DDL é fornecido pelo Script DOM. O modelo de banco de dados resultante é fornecido pelo modelo do esquema.

Fluxo de dados entre os componentes de extensibilidade

O diagrama a seguir mostra como os dados fluem através desses componentes.

Fluxo de dados entre os componentes de extensibilidade

Fluxo de dados entre componentes de extensibilidade

As definições dos objetos de banco de dados são persistentes no projeto de banco de dados na forma de scripts DDL. Quando você abre um projeto de banco de dados, esses scripts são lidos e dois modelos são preenchidos: o modelo de Script DOM e o modelo de esquema. Recursos do Visual Studio Premium interagir com os dois modelos, e quando você salva as alterações em objetos de banco de dados, essas alterações são persistentes novamente em scripts DDL.

Componentes de extensibilidade no Database Edition

O diagrama a seguir mostra os componentes que interagem para que você possa estender os recursos de edição de banco de dados.

Comunicação entre componentes de extensibilidade

Componentes de extensibilidade do Database Edition

Quando você abre ou cria qualquer projeto de banco de dados, o componente Gerenciador de extensão carrega quaisquer provedores de esquema do banco de dados registrados. Quando você usa os recursos específicos para um provedor de esquema de banco de dados (DSP), o componente Gerenciador de extensão carrega os recursos e suas extensões que oferecem suporte daquele DSP. Por exemplo, quando você usa recursos de refatoração Renomear para renomear objetos em um SQL Server 2008 banco de dados, o recurso de refatoração é carregado, juntamente com os tipos de refatoração e colaboradores para SQL Server 2008.

O gerente de extensão

Quando você executa o Visual Studio Premium ou Visual Studio Ultimate, todos os projetos de banco de dados, provedores de esquema, recursos e extensões de recurso interagem singleton ExtensionManager. O extension manager carrega uma única instância derivada de DatabaseSchemaProvider para cada projeto de banco de dados. Por exemplo, quando Visual Studio Premium ou Visual Studio Ultimate abre uma Microsoft SQL Server 2005 o projeto, o extension manager carrega uma instância de Sql90DatabaseSchemaProvider (que ele derivado DatabaseSchemaProvider).

O extension manager carrega extensões com base no tipo de interface implementada por essas extensões. Por exemplo, quando você usa o recurso de teste de unidade de banco de dados, o gerente de extensão retorna uma lista de extensões registradas que herdam a TestCondition a classe base, e cujas extensões são compatíveis com o provedor do esquema de banco de dados para o projeto de banco de dados.

Compatibilidade de extensão do recurso

Um recurso, como, por exemplo, análise de código de refatoração ou estático é composto de componentes que são específicos para um DSP e os componentes que oferecem suporte a todos os DSPs (componentes do DSP agnóstica). Quando você define uma extensão do recurso, declarar a compatibilidade de extensão com um DSP específico ou com um DSP de base para que a extensão é carregada somente para tipos de projeto apropriada. Por exemplo, você poderia declarar que sua extensão era compatível com Sql90DatabaseSchemaProvider (para restringir o que ele SQL Server 2005 projetos) ou com SqlDatabaseSchemaProvider (a classe base para SQL Server 2005 e SQL Server 2008 DSPs). Você também pode declarar uma extensão para ser compatível com vários, DSPs específicos. Se você não tiver certeza se as versões futuras podem romper o recurso, você pode usar essa abordagem. Para declarar um recurso para ser compatível com todos os DSPs, declare-o como compatível com o DatabaseSchemaProvider classe de base.

Exemplos

Defina a extensão compatível com um DSP:

// SqlSchemaObjectDesigners is defined as compatible with all Sql 
// database services providers.  
[DatabaseSchemaProviderCompatibility (typeof(Sql90DatabaseSchemaProvider))]
internal class SqlSchemaObjectDesigners : ISchemaObjectDesigners
{
}

Defina a extensão compatível com vários DSPs:

// Extension InconclusiveCondition is defined as compatible with all 
// SQL Server database services providers and Oracle database 
// services providers.
[DatabaseSchemaProviderCompatibility (typeof(SqlDatabaseSchemaProvider))]
[DatabaseSchemaProviderCompatibility (typeof(OracleDatabaseSchemaProvider))]
public sealed class InconclusiveCondition : TestCondition
{
}

Defina a extensão compatível com todos os DSPs:

// Extension ReportingService is defined as compatible with all
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(DatabaseSchemaProvider))]
internal class ReportingService : IReportingService
{
}

Defina a extensão compatível com nenhum dos DSPs:

// Extension ExecutionTimeCondition is defined as compatible with no
// database services providers.  That means if a feature
// has an ExtensionManager constructed with null, it will load
// those extensions defined as binding to 
// DspCompatibilityCategory.None
[DatabaseSchemaProviderCompatibility (DspCompatibilityCategory.None)]
public sealed class ExecutionTimeCondition : TestCondition
{
}

Tipos de extensões de recurso

Você pode criar extensões de recurso que aprimoram os recursos de vários a Visual Studio Premium ou Visual Studio Ultimate recursos. A tabela a seguir descreve os tipos de extensões que você pode criar.

Característica

Tipo de extensão

Descrição

Teste de unidade de banco de dados

Condições de teste de unidade

Você pode adicionar asserções personalizadas para determinar o sucesso ou fracasso de seus testes. A maioria da APIs de testes de unidade é pública, mas não representa um ponto de extensibilidade. Essas APIs são usados para criar testes de unidade de banco de dados que são escritos em código gerenciado, como Visual C# ou Visual Basic. Para obter mais informações, consulte Definir condições de personalizado para testes de unidade de banco de dados.

Geração de dados

Geradores de dados

Você pode usar a API de extensibilidade para criar os geradores de dados personalizados, se os geradores de dados são fornecidos com o Visual Studio Premium ou Visual Studio Ultimate. Para obter mais informações, consulte Gerar dados de teste especializado com um gerador de dados personalizados.

Análise de código do banco de dados

Regras de análise de código

Você pode definir suas próprias regras de análise de código para verificar se há problemas específicos em seu código de banco de dados. Para obter mais informações, consulte Criar e registrar regras adicionais para analisar o código do banco de dados.

Refatoração de banco de dados

Destinos de refatoração

Você pode estender os tipos existentes de refatoração para operar em novos destinos, como, por exemplo, novos tipos de arquivo. Para obter mais informações, consulte Demonstra Passo a passo: Estendendo o banco de dados renomear a refatoração para operar em arquivos de texto.

Refatoração de banco de dados

Tipos de refatoração

Você pode criar novos tipos de refatoração, como, por exemplo, substituindo condicionais aninhados com protetor de cláusulas. Para obter mais informações, consulte Criar banco de dados personalizado refatoração tipos ou destinos.

Componentes principais dos provedores de esquema do banco de dados

Um provedor de esquema de banco de dados (DSP) é composto por três grupos de componentes:

  • Script DOM — um modelo de objeto e oferecer suporte a serviços que modelam um script arbitrário de SQL que inclui instruções de DDL e DML.

  • Modelo de esquema — um modelo de objeto e serviços que modelam os objetos em uma instância de banco de dados, como, por exemplo, tabelas, visões e procedimentos armazenados de suporte.

  • Serviços de interação do usuário — uma coleção de serviços que permitem que os componentes principais acessar recursos de interface de usuário, como, por exemplo, as seqüências de caracteres que representam os nomes dos objetos, os ícones que representam os tipos de objeto e categorias e as hierarquias no qual exibir esses objetos.

As funções principais de um DSP são para habilitar o processamento de scripts DDL em representações de Script DOM e o modelo de esquema e para ativar a função inversa de reproduzir as representações de modelo de dois de scripts.

O Script DOM

Um Script de DOM fornece uma implementação que analisa um script DDL dentro de um modelo de objeto que representa o script. O DOM do Script também fornece a implementação para reproduzir o script original do modelo.

O diagrama a seguir mostra como os dados fluem por meio de scripts DOM.

Fluxo de dados por meio do Script DOM

Fluxo de dados através de DOM de script

O analisador de Script DOM converte o script, armazenado em um arquivo de texto não-estruturados, para um objeto que herda de IScriptFragment interface. O gerador de scripts no Script DOM leva a um objeto que herda de IScriptFragment interface e produz o script de original. Nos provedores de esquema de banco de dados para SQL Server, que são incluídos com Visual Studio Premium ou Visual Studio Ultimate, IScriptFragment resumos de uma árvore de sintaxe abstrata (AST) e um fluxo de token.

Tokens fornecem uma representação não-estruturada de um script. Cada token na coleção possui:

  • O tipo de token (como, por exemplo, palavra-chave ou seqüência de caracteres literal)

  • A seqüência de caracteres de símbolo

  • O arquivo de origem no qual ocorreu o token

  • O deslocamento dentro desse arquivo no qual ocorreu o token

Árvores de sintaxe abstrata (ASTs) fornecem uma representação estruturada do script. Cada nó na AST representa um lote de instruções, uma instrução ou um componente de uma instrução (como, por exemplo, uma expressão). ASTs são usados para analisar os scripts após terem sido analisados. ASTs também são usadas para programaticamente criar scripts.

O modelo de esquema

A representação do modelo de esquema é um modelo de objeto baseado em interface que modela uma instância de banco de dados ao vivo. Interfaces são organizadas em uma hierarquia de derivação que inclui uma única camada abstrata que é compartilhada por todos os DSPs, juntamente com qualquer número de camadas abstratas, direcionamento de detalhes do modelo da mais específica. Por exemplo, o ISql90Table interface é herdeira ISqlTable, que herda a interface de camada abstrata IDatabaseTable. O modelo de esquema leva a IScriptFragment objetos e traduz-se em elementos de modelo de esquema e também executa a conversão inversa, de elementos de modelo de esquema em IScriptFragment objetos. O modelo de esquema é composto de algum número de implementações do Composer de modelo. Cada implementação cria um modelo de algum outro recurso do sistema. Por exemplo, o ScriptModelComposer compõe um modelo a partir de arquivos de script que mantido no projeto de banco de dados.

A infra-estrutura do modelo de esquema (ModelStore e suas classes de suporte) implementa as referências de Script DOM integradas diretamente de elementos de modelo. Isso permite a modelagem de objetos, como, por exemplo, procedimentos armazenados, que contêm scripts arbitrários.

Um modelo de esquema consiste em uma coleção de elementos e anotações. Elementos descrevem o artefato que estão sendo modelado (como tabelas, modos de exibição, procedimentos armazenados, disparadores, colunas e assim por diante). As anotações são usadas para associar dados arbitrários com o modelo. As anotações são usadas pelos componentes do núcleo de projeto do banco de dados e também pode ser usados pelos recursos do projeto e extensões de recurso. Anotações e elementos podem ser nomeadas ou anônimas.

Elementos de modelo

Elementos são compostos de propriedades e relacionamentos. Propriedades representam os dados básicos, como números inteiros, valores booleanos e seqüências de caracteres e eles são usados para capturar os detalhes do modelo. As relações representam conexões nomeadas e digitadas entre elementos. Por exemplo, um ISqlTable elemento mantém um relacionamento do tipo ISqlColumn chamado de "Colunas" a tabela que associa suas colunas.

Existem três tipos básicos de relacionamentos:

  • Peer — representa uma dependência de um elemento em um outro elemento de uma maneira arbitrária. Em SQL Server, melhor a relação entre um modo de exibição e uma tabela será modelada como um relacionamento de peer.

  • Compondo — representa um elemento consiste em outros elementos. Em SQL Server, a relação entre uma tabela e suas colunas é melhor modelada como um relacionamento composing. Um princípio fundamental de um relacionamento composing é que os dois elementos são criados ao mesmo tempo, como uma única ação. Os elementos não possuem uma ordem de dependência para a criação ou remoção. No entanto, a direção de dependência de pai para filho é mantida pelo modelo para habilitar dependências associativas. Por exemplo, se uma coluna tiver uma dependência em um determinado tipo, a dependência da tabela pai na sua coluna composing significa que a tabela também depende do tipo.

  • Hierárquica — representa uma hierarquia. As relações hierárquicas diferem redigir relações porque a direção de dependência é de filho para pai (em vez de outra forma ao redor). Um exemplo em SQL Server é a relação entre um esquema e um objeto de propriedade, como uma tabela ou modo de exibição. Uma tabela participa de uma relação hierárquica com seu esquema.

O diagrama a seguir mostra os três tipos de relações que podem ser representados no modelo de esquema.

Relações de objeto no modelo de esquema

Relações de objetos no modelo de esquema

Cada relação em um modelo declara que se ele é um multi-relationship ou um único relacionamento. Em todos os casos, um elemento pode manter uma relação de vazia. Os modelos podem ser incompletos modelos do artefato real.

Elementos são baseados em interface para suportar os recursos a seguir em uma implementação de armazenamento:

  • Elemento strong digitação (identidade)

  • Herança múltipla

    • Para oferecer suporte a partes específicas de DSP e de DSP independente do sistema

    • Para oferecer suporte a compartilhamento de "qualidades" em caso contrário, não relacionadas a tipos de elemento

  • Extensibilidade e flexibilidade de versão

O público de implementar todas as classes de elemento de modelo IModelElement interface. As anotações, relacionamentos e propriedades que podem ser acessadas usando o ModelStore metadados API a partir dessa classe. As interfaces, como IDatabaseTable, que servem para fornecer acesso (vinculado em tempo de compilação), propriedades e relacionamentos em uma maneira mais simples e passível de manutenção mais.

Anotações de modelo

Como os elementos, as anotações são compostas de propriedades. Diferentemente de elementos, as anotações não participam de relações. Em vez disso, as anotações são anexadas a elementos ou ao modelo do próprio armazenam. As anotações são fortemente tipadas e uma única instância de uma anotação que pode ser conectada a vários elementos além do armazenamento de modelo. Anotações do modelo anexado representam uma instância de anotação é "global" o modelo.