Criar relações entre conjuntos de dados em aplicativos do .NET Framework

Observação

Os conjuntos de dados e as classes relacionadas são tecnologias herdadas do .NET Framework do início dos anos 2000 que permitem que os aplicativos trabalhem com dados na memória enquanto os aplicativos estão desconectados do banco de dados. As tecnologias são bastante úteis em aplicativos que permitem que os usuários modifiquem dados e persistam as alterações no banco de dados. Embora os conjuntos de dados tenham se mostrado uma tecnologia muito bem-sucedida, é recomendado que os novos aplicativos .NET usem o Entity Framework Core. O Entity Framework proporciona uma forma mais natural de trabalhar com dados tabulares como modelos de objeto e conta com uma interface de programação mais simples.

Os conjuntos de dados que contêm tabelas de dados relacionadas usam objetos DataRelation para representar uma relação pai/filho entre as tabelas e para retornar registros relacionados entre si. A adição de tabelas relacionadas a conjuntos de dados usando o Assistente de Configuração da Fonte de Dados ou o Designer de Conjunto de Dados cria e configura o objeto DataRelation para você.

O objeto DataRelation executa duas funções:

  • Ele pode disponibilizar os registros relacionados a um registro com o qual você está trabalhando. Ele fornece registros filho se você estiver em um registro pai (GetChildRows) e um registro pai se você estiver trabalhando com um registro filho (GetParentRow).

  • Ele pode impor restrições para integridade referencial, como excluir registros filho relacionados quando você exclui um registro pai.

É importante entender a diferença entre uma junção verdadeira e a função de um objeto DataRelation. Em uma junção verdadeira, os registros são obtidos de tabelas pai e filho e colocados em um único conjunto de registros simples. Quando você usa um objeto DataRelation, nenhum novo conjunto de registros é criado. Em vez disso, o DataRelation controla a relação entre tabelas e mantém os registros pai e filho em sincronia.

Objetos e restrições do DataRelation

Um objeto DataRelation também é usado para criar e impor as seguintes restrições:

  • Uma restrição exclusiva, que garante que uma coluna na tabela não contenha duplicatas.

  • Uma restrição de chave estrangeira, que pode ser usada para manter a integridade referencial entre uma tabela pai e filho em um conjunto de dados.

As restrições especificadas em um objeto DataRelation são implementadas criando automaticamente objetos apropriados ou definindo propriedades. Se você criar uma restrição de chave estrangeira usando o objeto DataRelation, instâncias da classe ForeignKeyConstraint serão adicionadas à propriedade DataRelation do objeto ChildKeyConstraint.

Uma restrição exclusiva é implementada simplesmente definindo a propriedade Unique de uma coluna de dados como true ou adicionando uma instância da classe UniqueConstraint à propriedade DataRelation do objeto ParentKeyConstraint. Para obter informações sobre como suspender restrições em um conjunto de dados, consulte Desativar restrições ao preencher um conjunto de dados.

Regras de integridade referencial

Como parte da restrição de chave estrangeira, você pode especificar regras de integridade referencial aplicadas em três pontos:

  • Quando um registro pai é atualizado

  • Quando um registro pai é excluído

  • Quando uma alteração é aceita ou rejeitada

As regras possíveis estão especificadas na enumeração Rule e listadas na tabela a seguir.

Regra de restrição de chave estrangeira Ação
Cascade A alteração (atualização ou exclusão) feita no registro pai também é feita em registros relacionados na tabela filho.
SetNull Os registros filho não são excluídos, mas a chave estrangeira nos registros filho é definida como DBNull. Com essa configuração, os registros filho podem ser deixados como "órfãos", ou seja, eles não têm relação com os registros pai. Observação: o uso dessa regra pode resultar em dados inválidos na tabela filho.
SetDefault A chave estrangeira nos registros filho relacionados é definida como seu valor padrão (conforme estabelecido pela propriedade DefaultValue da coluna).
None Nenhuma alteração é feita nos registros filho relacionados. Com essa configuração, os registros filho podem conter referências a registros pai inválidos.

Para obter mais informações sobre atualizações em tabelas de conjunto de dados, consulte Salvar dados novamente no banco de dados.

Relações somente restrição

Ao criar um objeto DataRelation, você tem a opção de especificar que a relação seja usada apenas para impor restrições, ou seja, ela também não será usada para acessar registros relacionados. Você pode usar essa opção para gerar um conjunto de dados um pouco mais eficiente e que contenha menos métodos do que um com a funcionalidade de registros relacionados. No entanto, você não poderá acessar registros relacionados. Por exemplo, uma relação somente restrição impede que você exclua um registro pai que ainda tenha registros filho e você não pode acessar os registros filho por meio do pai.

Criar manualmente uma relação de dados no Designer de Conjunto de Dados

Quando você cria tabelas de dados usando as ferramentas de design de dados no Visual Studio, as relações são criadas automaticamente se as informações puderem ser coletadas da fonte de seus dados. Se você adicionar manualmente tabelas de dados da guia Conjunto de Dados da Caixa de Ferramentas, talvez seja necessário criar a relação manualmente. Para obter informações sobre como criar objetos DataRelation programaticamente, consulte Adicionando DataRelations.

As relações entre tabelas de dados aparecem como linhas no Designer de Conjunto de Dados, com um glifo de infinito e chave representando o aspecto um para muitos da relação. Por padrão, o nome da relação não aparece na superfície de design.

Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de interface do usuário do Visual Studio neste artigo. Você pode estar usando outra edição do Visual Studio ou outras configurações de ambiente. Para obter mais informações, confira Personalizar o IDE.

Para criar uma relação entre duas tabelas de dados

  1. Abra o conjunto de dados no Designer de Conjunto de Dados. Para obter mais informações, confira Passo a passo: criar um conjunto de dados no Designer de Conjunto de Dados.

  2. Arraste um objeto Relation da caixa de ferramentas DataSet para a tabela de dados filho na relação.

    A caixa de diálogo Relação é aberta, preenchendo a caixa Tabela Filho com a tabela para a qual você arrastou o objeto Relation.

  3. Selecione a tabela pai na caixa Tabela Pai. A tabela pai contém registros no lado "um" de uma relação um para muitos.

  4. Verifique se a tabela filho correta é exibida na caixa Tabela Filho. A tabela filho contém registros no lado "muitos" de uma relação um para muitos.

  5. Digite um nome para a relação na caixa Nome ou deixe o nome padrão com base nas tabelas selecionadas. Esse é o nome do objeto DataRelation real no código.

  6. Selecione as colunas que ingressam nas tabelas nas listas Colunas de Chave e Colunas de Chave Estrangeira.

  7. Selecione se deseja criar uma relação, restrição ou ambos.

  8. Selecione ou desmarque a caixa Relação Aninhada. A seleção dessa opção define a propriedade Nested como true e faz com que as linhas filho da relação sejam aninhadas dentro da coluna pai quando essas linhas são gravadas como dados XML ou sincronizadas com XmlDataDocument. Para obter mais informações, consulte Nesting DataRelations.

  9. Defina as regras a serem impostas quando você estiver fazendo alterações nos registros nessas tabelas. Para obter mais informações, consulte Rule.

  10. Clique em OK para criar a relação. Uma linha da relação aparece no designer entre as duas tabelas.

Para exibir um nome da relação no Designer de Conjunto de Dados

  1. Abra o conjunto de dados no Designer de Conjunto de Dados. Para obter mais informações, confira Passo a passo: criar um conjunto de dados no Designer de Conjunto de Dados.

  2. No menu Dados, selecione o comando Mostrar Rótulos da Relação para exibir o nome da relação. Desmarque esse comando para ocultar o nome da relação.