Compartilhar via


Passo a passo: personalizar o comportamento de inserção, atualização e exclusão de classes de entidade

Observação

A DataSet classe 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 são desconectados do banco de dados. As tecnologias são especialmente úteis para aplicativos que permitem que os usuários modifiquem dados e persistam as alterações no banco de dados. Embora os conjuntos de dados sejam uma tecnologia comprovadamente bem-sucedida, a abordagem recomendada para novos aplicativos .NET é usar o Entity Framework Core. O Entity Framework fornece uma maneira mais natural de trabalhar com dados tabulares como modelos de objeto e tem uma interface de programação mais simples.

As ferramentas LINQ to SQL no Visual Studio fornecem uma superfície de design visual para criar e editar classes LINQ to SQL (classes de entidade) baseadas em objetos em um banco de dados. Usando LINQ to SQL, você pode usar a tecnologia LINQ para acessar bancos de dados SQL. Para obter mais informações, consulte LINQ (Consulta Integrada à Linguagem).

Por padrão, a lógica para executar atualizações é fornecida pelo runtime LINQ to SQL. O runtime cria instruções padrão Insert, Update e Delete com base no esquema da tabela (definições de coluna e informações da chave primária). Quando você não quiser usar o comportamento padrão, poderá configurar o comportamento de atualização e designar procedimentos armazenados específicos para executar as inserções, atualizações e exclusões necessárias para trabalhar com os dados no banco de dados. Você também pode fazer isso quando o comportamento padrão não é gerado, por exemplo, quando as classes de entidade mapeiam para as exibições. Além disso, você pode substituir o comportamento de atualização padrão quando o banco de dados requer acesso à tabela por meio de procedimentos armazenados. Para obter mais informações, consulte Personalizar operações usando procedimentos armazenados.

Observação

Este passo a passo requer a disponibilidade dos procedimentos armazenados InsertCustomer, UpdateCustomer e DeleteCustomer para o banco de dados Northwind.

Este passo a passo fornece as etapas que você deve seguir para substituir o comportamento de tempo de execução padrão do LINQ to SQL para salvar dados em um banco de dados usando procedimentos armazenados.

Durante este passo a passo, você aprenderá a executar as seguintes tarefas:

  • Crie um novo aplicativo do Windows Forms e adicione um arquivo LINQ to SQL ao projeto.

  • Crie uma classe de entidade que é mapeada para a tabela Northwind Customers.

  • Crie uma fonte de dados de objeto que faça referência à classe LINQ to SQL Customer .

  • Crie um Formulário do Windows que contenha um DataGridView associado à Customer classe.

  • Implemente a funcionalidade save para o formulário.

  • Crie DataContext métodos adicionando procedimentos armazenados ao Designer O/R.

  • Configure a Customer classe para usar procedimentos armazenados para executar inserções, atualizações e exclusões.

Pré-requisitos

Este passo a passo usa o SQL Server Express LocalDB e o banco de dados de exemplo Northwind.

  1. Se você não tiver o SQL Server Express LocalDB, instale-o na página de download do SQL Server Express ou por meio do Instalador do Visual Studio. No Instalador do Visual Studio, você pode instalar o SQL Server Express LocalDB como parte da carga de trabalho Armazenamento e processamento de dados ou como um componente individual.

  2. Instale o banco de dados de exemplo Northwind seguindo estas etapas:

    1. No Visual Studio, abra a janela Pesquisador de Objetos do SQL Server. (O Pesquisador de Objetos do SQL Server é instalado como parte da carga de trabalho de armazenamento e processamento de dados no Instalador do Visual Studio.) Expanda o nó SQL Server. Clique com o botão direito do mouse na instância do LocalDB e selecione Nova Consulta.

      Uma janela do editor de consultas é aberta.

    2. Copie o script Transact-SQL da Northwind para sua área de transferência. Esse script T-SQL cria o banco de dados Northwind do zero e o preenche com dados.

    3. Cole o script T-SQL no editor de consultas e, em seguida, escolha o botão Executar.

      Após um curto período de tempo, a consulta termina de ser executada e o banco de dados Northwind é criado.

Criar um aplicativo e adicionar o LINQ às classes SQL

Como você está trabalhando com classes LINQ to SQL e exibindo os dados em um Formulário do Windows, crie um novo aplicativo do Windows Forms e adicione um arquivo LINQ às Classes SQL.

Observação

As instruções deste artigo ilustram a versão mais recente da experiência de desenvolvimento interativo (IDE) disponível no Visual Studio. Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário. Talvez você esteja usando uma versão diferente do Visual Studio ou configurações de ambiente diferentes. Para obter mais informações, consulte Personalizar o IDE.

Para criar um novo projeto de Aplicativo do Windows Forms que contenha classes LINQ to SQL

  1. No Visual Studio, no menu Arquivo, selecione Novo>Projeto.

  2. Expanda o Visual C# ou o Visual Basic no painel esquerdo e selecione a Área de Trabalho do Windows.

  3. No painel do meio, selecione o tipo de projeto de Aplicativo do Windows Forms .

  4. Nomeie o projeto UpdatingWithSProcsWalkthrough e escolha OK.

    O projeto UpdatingWithSProcsWalkthrough é criado e adicionado ao Gerenciador de Soluções.

  5. No menu Project, clique em Adicionar Novo Item.

  6. Clique no modelo LINQ to SQL Classes e digite Northwind.dbml na caixa Nome .

  7. Clique em Adicionar.

    Um arquivo LINQ to SQL Classes (Northwind.dbml) vazio é adicionado ao projeto e o Designer O/R é aberto.

Criar a classe de entidade do cliente e a fonte de dados do objeto

Crie classes LINQ to SQL que são mapeadas para tabelas de banco de dados arrastando tabelas do Gerenciador de Servidores ou Database Explorer para o Object Relational Designer. O resultado são classes de entidade do LINQ to SQL que mapeiam para as tabelas no banco de dados. Depois de criar classes de entidade, elas podem ser usadas como fontes de dados de objeto, assim como outras classes que têm propriedades públicas.

Para criar uma classe de entidade de cliente e configurar uma fonte de dados com ela

  1. No Gerenciador de Servidores ou No Gerenciador de Banco de Dados, localize a tabela Cliente na versão do SQL Server do banco de dados de exemplo Northwind.

  2. Arraste o nó Customers do Gerenciador de Servidores ou Database Explorer para a superfície do *Object Relational Designer.

    Uma classe de entidade chamada Customer é criada. Ele tem propriedades que correspondem às colunas na tabela Clientes. A classe de entidade é denominada Cliente (não Clientes) porque representa um único cliente da tabela Clientes.

    Observação

    Esse comportamento de renomeação é chamado de pluralização. Ela pode ser ativada ou desativada na caixa de diálogo Opções. Para obter mais informações, consulte Como ativar e desativar a pluralização (Designer O/R).

  3. No menu Build, clique em Compilar UpdatingwithSProcsWalkthrough para compilar o projeto.

  4. Para abrir a janela Fontes de Dados , no menu Dados , clique em Mostrar Fontes de Dados.

  5. Na janela de Fontes de Dados, clique em Adicionar Nova Fonte de Dados.

  6. Clique em Objeto na página Escolher um Tipo de Fonte de Dados e selecione Avançar.

  7. Expanda o nó UpdatingwithSProcsWalkthrough e localize e selecione a classe Customer.

    Observação

    Se a classe Cliente não estiver disponível, cancele o assistente, crie o projeto e execute o assistente novamente.

  8. Clique em Concluir para criar a fonte de dados e adicionar a classe entidade Cliente à janela Fontes de Dados .

Criar um DataGridView para exibir os dados do cliente em um Formulário do Windows

Crie controles associados a classes de entidade arrastando itens da fonte de dados do LINQ to SQL da janela Fontes de Dados para um Formulário do Windows.

Para adicionar controles associados às classes de entidade

  1. Abra o Formulário1 no modo design.

  2. Da janela Fontes de Dados, arraste o nó Customer para o Form1.

    Observação

    Para exibir a janela Fontes de Dados , clique em Mostrar Fontes de Dados no menu Dados .

  3. Abra o Formulário1 no Editor de Código.

  4. Adicione o seguinte código ao formulário, global ao formulário, fora de qualquer método específico, mas dentro da Form1 classe:

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Crie um manipulador de eventos para o Form_Load evento e adicione o seguinte código ao manipulador:

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implementar a funcionalidade de salvamento

Por padrão, o botão salvar não está habilitado e a funcionalidade de salvamento não é implementada. Além disso, o código não é adicionado automaticamente para salvar dados alterados no banco de dados quando controles associados a dados são criados para fontes de dados de objeto. Esta seção explica como habilitar o botão salvar e implementar a funcionalidade salvar para objetos LINQ to SQL.

Para implementar a funcionalidade de salvar

  1. Abra o Formulário1 no modo design.

  2. Selecione o botão Salvar no CustomerBindingNavigator (o botão com o ícone de disquete).

  3. Na janela Propriedades , defina a propriedade Habilitada como True.

  4. Clique duas vezes no botão Salvar para criar um manipulador de eventos e alternar para o Editor de Código.

  5. Adicione o seguinte código ao manipulador de eventos do botão salvar:

    northwindDataContext1.SubmitChanges();
    

Sobrescreva o comportamento padrão para executar atualizações (inserções, atualizações e exclusões)

Para substituir o comportamento de atualização padrão

  1. Abra o arquivo LINQ to SQL no Designer O/R. (Clique duas vezes no arquivo Northwind.dbml no Gerenciador de Soluções.)

  2. No Gerenciador de Servidores ou Gerenciador de Banco de Dados, expanda o nó Procedimentos Armazenados dos bancos de dados Northwind e localize os InsertCustomers, UpdateCustomers e DeleteCustomers.

  3. Arraste todos os três procedimentos armazenados para o Designer O/R.

    Os procedimentos armazenados são adicionados ao painel métodos como DataContext métodos. Para obter mais informações, confira métodos DataContext (Object Relational Designer).

  4. Selecione a classe entidade Cliente no Designer O/R.

  5. Na janela Propriedades , selecione a propriedade Insert .

  6. Clique nas reticências () ao lado de Usar runtime para abrir a caixa de diálogo Configurar Comportamento.

  7. Selecione Personalizar.

  8. Selecione o método InsertCustomers na lista Personalizar .

  9. Clique em Aplicar para salvar a configuração para a Classe e o Comportamento selecionados.

    Observação

    Você pode continuar a configurar o comportamento para cada combinação de classe/comportamento, desde que clique em Aplicar depois de fazer cada alteração. Se você alterar a classe ou o comportamento antes de clicar em Aplicar, será exibida uma caixa de diálogo de aviso que oferece uma oportunidade para aplicar as alterações.

  10. Selecione Atualizar na lista Comportamento .

  11. Selecione Personalizar.

  12. Selecione o método UpdateCustomers na lista Personalizar .

    Inspecione a lista de argumentos de método e propriedades de classe e observe que há dois argumentos de método e duas propriedades de classe para algumas colunas na tabela. Isso facilita controlar as alterações e criar as instruções que conferem a existência de violações de simultaneidade.

  13. Mapeie o argumento do método Original_CustomerID para a propriedade de classe CustomerID (Original ).

    Observação

    Por padrão, os argumentos do método serão mapeados para propriedades de classe quando os nomes corresponderem. Se os nomes de propriedade forem alterados e não corresponderem mais entre a tabela e a classe de entidade, talvez seja necessário selecionar a propriedade de classe equivalente para a qual mapear se o Designer O/R não puder determinar o mapeamento correto. Além disso, se os argumentos do método não tiverem propriedades de classe válidas para as quais mapear, você poderá definir o valor das Propriedades de Classe como (Nenhum).

  14. Clique em Aplicar para salvar a configuração para a Classe e o Comportamento selecionados.

  15. Selecione Excluir na lista Comportamento .

  16. Selecione Personalizar.

  17. Selecione o método DeleteCustomers na lista Personalizar .

  18. Mapeie o argumento do método Original_CustomerID para a propriedade de classe CustomerID (Original ).

  19. Clique em OK.

Observação

Embora não seja um problema para este passo a passo específico, vale a pena observar que o LINQ to SQL manipula valores gerados pelo banco de dados automaticamente para identidade (incremento automático), rowguidcol (GUID (identificador global exclusivo gerado pelo banco de dados)) e colunas de carimbo de data/hora durante inserções e atualizações. Valores gerados por banco de dados em outros tipos de coluna resultarão inesperadamente em um valor nulo. Para retornar os valores gerados pelo banco de dados, você deve definir IsDbGenerated manualmente para true e AutoSync para um dos seguintes: AutoSync.Always, AutoSync.OnInsert ou AutoSync.OnUpdate.

Testar o aplicativo

Execute o aplicativo novamente para verificar se o procedimento armazenado UpdateCustomers atualiza corretamente o registro do cliente no banco de dados.

  1. Pressione F5.

  2. Modifique um registro na grade para testar o comportamento da atualização.

  3. Adicione um novo registro para testar o comportamento de inserção.

  4. Clique no botão Salvar para salvar as alterações de volta no banco de dados.

  5. Fechar o formulário.

  6. Pressione F5 e verifique se o registro atualizado e o registro recém-inserido persistiram.

  7. Exclua o novo registro criado na etapa 3 para testar o comportamento de exclusão.

  8. Clique no botão Salvar para enviar as alterações e remover o registro excluído do banco de dados.

  9. Fechar o formulário.

  10. Pressione F5 e verifique se o registro excluído foi removido do banco de dados.

    Observação

    Se o aplicativo usar o SQL Server Express Edition, dependendo do valor da propriedade Copy to Output Directory do arquivo de banco de dados, as alterações poderão não aparecer quando você pressionar F5 na etapa 10.

Próximas etapas

Dependendo dos requisitos do aplicativo, há várias etapas que talvez você queira executar depois de criar classes de entidade LINQ to SQL. Alguns aprimoramentos que você pode fazer para este aplicativo incluem o seguinte: