Passo a passo: personalizar a inserção, a atualização e o comportamento de exclusão de classes de entidade
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.
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 saber mais, consulte LINQ (Consulta Integrada à Linguagem).
Por padrão, a lógica para executar atualizações é fornecida pelo runtime do LINQ to SQL. O runtime cria instruções padrão Insert
, Update
e Delete
com base no esquema da tabela (as definições de coluna e as informações da chave primária). Quando você não deseja usar o comportamento padrão, poderá configurar o comportamento de atualização e designar procedimentos armazenados específicos para executar as inserções, as atualizações e as 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 exige acesso à tabela por meio dos procedimentos armazenados. Para obter mais informações, consulte Personalizando operações usando procedimentos armazenados.
Observação
Essa explicação passo a passo exige a disponibilidade dos procedimentos armazenados InsertCustomer, UpdateCustomer e DeleteCustomer para o banco de dados Northwind.
Essa explicação passo a passo fornece as etapas que você deve seguir para substituir o comportamento padrão de runtime LINQ to SQL para salvar dados de volta para um banco de dados usando procedimentos armazenados.
Durante essa explicação passo a passo, é ensinado como realizar as seguintes tarefas:
Crie um novo aplicativo do Windows Forms e adicione um arquivo LINQ to SQL a ele.
Crie uma classe de entidade que está mapeada para a tabela
Customers
Northwind.Crie uma fonte de dados de objeto que referencia a classe
Customer
LINQ to SQL.Crie um Windows Form que contém um DataGridView que está associado à classe
Customer
.Implemente a funcionalidade de salvar para o formulário.
Crie métodos de DataContext adicionando procedimentos armazenados ao O/R Designer.
Configure a classe
Customer
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 da Northwind.
Se você não tiver SQL Server Express LocalDB, instale-o por meio da página de download do SQL Server Express ou usando o 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.
Instale o banco de dados de exemplo da Northwind seguindo estas etapas:
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 Armazenamento e processamento de dados no Instalador do Visual Studio.) Expanda o nó do 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 vai se abrir.
Copie o script Transact-SQL da Northwind para sua área de transferência. Esse script T-SQL cria o banco de dados da Northwind do zero e o preenche com alguns dados.
Cole o script T-SQL no editor de consultas e, em seguida, escolha o botão Executar.
Após um curto período, a consulta termina de ser executada e o banco de dados da Northwind é criado.
Criando um aplicativo e adicionando classes LINQ to SQL
Como você está trabalhando com classes LINQ to SQL e exibindo os dados em um Windows Form, crie um novo aplicativo do Windows Forms e adicione um arquivo de classes LINQ to SQL.
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 um novo projeto de aplicativo Windows Forms que contém classes LINQ to SQL
No Visual Studio, no menu Arquivo, selecione Novo>Projeto.
Expanda Visual C# ou Visual Basic no painel esquerdo e selecione Área de Trabalho do Windows.
No painel central, selecione o tipo de projeto Aplicativo do Windows Forms.
Dê ao projeto o nome UpdatingWithSProcsWalkthrough, em seguida, escolha OK.
O projeto de UpdatingWithSProcsWalkthrough é criado e adicionado ao Gerenciador de Soluções.
No menu Projeto , clique em Adicionar Novo Item.
Clique no modelo Classes LINQ to SQL e digite Northwind.dbml na caixa Nome.
Clique em Adicionar.
Um arquivo de classes LINQ to SQL vazio (Northwind.dbml) é adicionado ao projeto, e o Object Relational Designer é aberto.
Criando a classe entidade de Cliente e o objeto de fonte de dados
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 Customer e configurar uma fonte de dados com ela
No Gerenciador de Servidores ou Database Explorer, localize a tabela Customer na versão do SQL Server do banco de dados de exemplo Northwind.
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. Ela tem propriedades que correspondem às colunas na tabela Customers. A classe de entidade é chamada de Customer (e não Customers) porque representa um único cliente da tabela Customers.
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 (Object Relational Designer).
No menu Compilar, clique em Compilar UpdatingwithSProcsWalkthrough para criar o projeto.
Para abrir a janela Fontes de Dados, no menu Dados, selecione Mostrar Fontes de Dados.
Na janela Fontes de Dados, clique em Adicionar Nova Fonte de Dados.
Clique em Objeto na página Escolher um Tipo de Fonte de Dados e selecione Avançar.
Expanda o nó UpdatingwithSProcsWalkthrough e localize e selecione a classe Customer.
Observação
Se a classe Customer não estiver disponível, cancele o assistente, compile o projeto e execute o assistente novamente.
Clique em Concluir para criar a fonte de dados e adicionar a classe de entidade Customer à janela Fontes de Dados.
Criando um DataGridView para exibir os dados do cliente em um Windows Form
Crie controles que estão associados a classes de entidade arrastando os itens de fonte de dados do LINQ to SQL da janela Fontes de Dados para um Windows Form.
Para adicionar controles que estão associados às classes de entidade
Abra Form1 no modo de exibição de Design.
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.
Abra o Form1 no Editor de Códigos.
Adicione o seguinte código ao formulário, global para o formulário, fora de qualquer método específico, mas dentro da classe
Form1
:Crie um manipulador de eventos para o evento
Form_Load
e adicione o seguinte código ao manipulador:
Implementar a funcionalidade de salvar
Por padrão, o botão de salvar não está habilitado e a funcionalidade de salvar não está implementada. Além disso, o código não será automaticamente adicionado para salvar dados modificados no banco de dados quando os controles associados a dados forem criados para fontes de dados de objeto. Essa seção explica como habilitar o botão de salvar e implementar a funcionalidade de salvar para objetos LINQ to SQL.
Para implementar a funcionalidade de salvar
Abra Form1 no modo de exibição de Design.
Selecione o botão de salvar no CustomerBindingNavigator (o botão com o ícone de disquete).
Na janela Propriedades, defina a propriedade Habilitado como True.
Clique duas vezes no botão de salvar para criar um manipulador de eventos e alternar para o Editor de Códigos.
Adicione o código a seguir no manipulador de eventos do botão de salvar:
Substituindo o comportamento padrão para realizar atualizações (inserções, atualizações e exclusões)
Para substituir o comportamento padrão de atualização
Abra o arquivo LINQ to SQL no designer O/R Designer. (Clique duas vezes no arquivo Northwind.dbml no Gerenciador de Soluções.)
Em Gerenciador de Servidores/Gerenciador de Banco de Dados, expanda o nó Procedimentos Armazenados de bancos de dados Northwind e localize os procedimentos armazenados InsertCustomers, UpdateCustomers e DeleteCustomers.
Arraste os três procedimentos armazenados para o Object Relational Designer.
Os procedimentos armazenados são adicionados ao painel dos métodos como métodos DataContext. Para obter mais informações, confira métodos DataContext (Object Relational Designer).
Selecione a classe de entidade Customer no Object Relational Designer.
Na janela Propriedades, selecione a propriedade Insert.
Clique nas reticências (…) ao lado de Usar runtime para abrir a caixa de diálogo Configurar Comportamento.
Selecione Personalizar.
Selecione o método InsertCustomers na lista Personalizar.
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 quando você clica em Aplicar depois de cada alteração. Se você alterar a classe ou o comportamento antes de clicar em Aplicar, uma caixa de diálogo de aviso com uma oportunidade de aplicar as alterações será exibida.
Selecione Atualizar na lista Comportamento.
Selecione Personalizar.
Selecione o método UpdateCustomers na lista Personalizar.
Inspecione a lista de Argumentos de Método e de 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.
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 mapearão para as propriedades da classe quando os nomes corresponderem. Se os nomes de propriedade forem modificados e não corresponderem entre a tabela e a classe de entidade, poderá ser preciso selecionar a propriedade da classe equivalente para a qual mapear se o Designer Relacional de Objetos não puder determinar o mapeamento correto. Além disso, se os argumentos do método não tiverem propriedades da classe válidas para a qual mapear, você poderá definir o valor de Propriedades de Classe como (Nenhum).
Clique em Aplicar para salvar a configuração para a Classe e o Comportamento selecionados.
Selecione Excluir na lista Comportamento.
Selecione Personalizar.
Selecione o método DeleteCustomers na lista Personalizar.
Mapeie o argumento do método Original_CustomerID para a propriedade de classe CustomerID (Original).
Clique em OK.
Observação
Embora isso não seja um problema para essa explicação passo a passo específica, vale observar que o LINQ to SQL manipula automaticamente os valores gerados por banco de dados para as colunas identidade (incremento automático), rowguidcol (identificador global exclusivo [GUID] gerado por banco de dados) e carimbo de data/hora durante inserções e atualizações. Os valores gerados pelo 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 como true
e AutoSync como 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.
Pressione F5.
Modifique um registro na grade para testar o comportamento de atualização.
Adicione um novo registro para testar o comportamento de inserção.
Clique no botão de salvar para salvar as alterações de volta para o banco de dados.
Feche o formulário.
Pressione F5 e verifique se o registro atualizado e o registro inserido recentemente persistiram.
Exclua o novo registro que você criou na etapa 3 para testar o comportamento de exclusão.
Clique no botão de salvar para enviar as alterações e remova o registro excluído do banco de dados.
Feche o formulário.
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 Copiar para Diretório de Saída do arquivo de banco de dados, as alterações poderão não aparecer quando você pressiona F5 na etapa 10.
Próximas etapas
Dependendo dos seus requisitos do aplicativo, há várias etapas que você pode querer realizar depois de criar as classes de entidade do LINQ to SQL. Entre algumas das melhorias que você pode fazer neste aplicativo estão:
Implementar verificação de simultaneidade durante atualizações. Para obter informações, confira Simultaneidade otimista: visão geral.
Adicionar consultas LINQ para filtrar dados. Para obter informações, consulte Introdução a consultas de LINQ (C#).