C# - CRUD básico com Entity Framework


Este artigo tem como objetivo ajudar quem esta iniciando com a linguagem C# a usar os recursos do Entity Framework para realizar as operações de CRUD (Create, Read, Update e Delete) em um banco de dados SQL Server.

Como é um artigo para iniciantes vai ser bem simples e usará um cenário bem amigável onde teremos um banco de dados SQL Server com apenas uma tabela com uma estrutura também bem simples.

Crie um  novo projeto usando o Visual Studio 2010 ou o Visual C# 2010 Express Edition com o nome CRUD_EF;

Eu vou usar o VS 2010 para criar o projeto no menu File -> New Project selecionando o template Other Languages -> Visual C# -> Windows Froms Application;

Vamos criar no SQL Server 2005 um banco de dados chamado Cadastro.mdf e uma tabela chamada Produtos com a seguinte estrutura:

A tabela Produtos é bem simples e possui os campos : produtoid, nomeProduto e categoriaid;

Obs: Voce pode criar o banco de dados no SQL Server Management Studio Express Edition. Veja o meu artigo:

Usando o SQL Server Management Studio - Macoratti.net

Obs: A tabela Categoria onde estão cadastrados os códigos da categoria não será usada neste exemplo mas esta relacionada com a tabela Produtos pela chave estrangeira categoriaid.

Agora vamos criar o Entity Data Model para gerar o modelo de entidades mapeando os campos da tabela para entidades que serão tratadas pelo Entity Framework;

No menu Project selecione Add New Item;

Selecione o template ADO .NET Entity Data Model com o nome Produto.edmx e clique em Add;

Seguindo o assistente selecione a opção Generate from database na próxima janela e clique Next>;

Selecione a seguir a conexão com o banco de dados Cadastro.mdf que foi criado no SQL Server e clique em Next>;

Na próxima janela selecione a tabela Produtos e clique em Finish;

Ao final teremos o modelo de entidades sendo representado pela entidade Produto mapeada para a tabela Produtos do nosso o banco de dados;

Com isso já estamos prontos para podermos realizar as operações de manutenção de dados usando o Entity Framework.

Vamos definir no formulário form1.cs uma interface bem simples incluindo no formulário os seguinte controles:

conforme o leiaute da figura abaixo:

Vamos agora definir as operações CRUD.

1- Read

A primeira será ler os registros da tabela e exibir no datagridview.

No evento Load do formulário defina o seguinte código:

private void Form1_Load(object sender, EventArgs e)
{
   lerProdutos();
}

Agora defina a rotina lerProdutos() conforme o código a seguir:

private void lerProdutos()
{
  
CadastroEntities context = new CadastroEntities();

   IEnumerable<Produto> lista = from p in context.Produtos select p;

   grpProdutos.Text = "Produtos: " + lista.Count();
   gdvProdutos.DataSource = lista.ToList();
}

O código cria uma instância do ObjectContext que foi criado no Entity Data Model e com ele temos acesso as entidades e aos recursos do Entity Framework.

A seguir efetuamos uma consulta usando uma expressão LINQ para selecionar no contexto todos os produtos mapeados para a entidade Produto. O retorno é do tipo IEnumerable<Produto> , a seguir exibimos o resultado no controle DataGridView.

A interface IEnumerable  expõe o enumerador que oferece suporte a iteração sobre a coleção do tipo especificado que no caso é a entidade Produto.

Estamos também contando o total de produtos obtidos usando o método Count().

Executando o projeto iremos obter o formulário exibindo os dados da tabela produtos no controle DataGridView: gdvProdutos;

2- Create

Agora vejamos o código que permitirá incluir um novo produto na tabela Produtos.

No evento Click do botão Incluir insira o seguinte código:

  private void btnIncluir_Click(object sender, EventArgs e)

   {

            CadastroEntities context = new CadastroEntities();

            Produto novoproduto = new Produto() { nomeProduto = txtProdutoNome.Text, categoriaid = Convert.ToInt32(txtCategoriaID.Text)};
            context.AddToProdutos(novoproduto);

            context.SaveChanges();

            lerProdutos();

  }

Para criar um novo produto , após criar a instância do Contexto, definimos uma nova entidade Produto atribuindo os valores informados no formulário para o nome do produto e para o código da categoria:

Depois usamos o método AddToProdutos para incluir o novo objeto Produto na coleção de objetos: context.AddToProdutos(novoproduto);

Você pode incluir novos objetos a um contexto de objeto através do método AddObject ou chamando um dos métodos AddToEntitySetName do ObjectConext.
Você também pode incluir um objeto a um contexto de objeto adicionando o objeto a um EntityCollection existente.
Quando você chama o método Add em um EntityCollection que esta anexada a um contexto de objeto , o objeto que você esta incluindo é adicionado ao mesmo ObjectContext.

Na linha de código  context.AddToProdutos(novoproduto) o método AddTo<EntityName>,  que é usado pelo EF baseado nas entidades geradas a partir do banco de dados,e , irá realizar a inclusão do novo objeto no contexto.

O código do produto é auto-incremental e controlado pelo gerenciado do banco de dados visto que definimos o campo como identity.

Para persistir as informações usamos o método SaveChanges().

3- Update

Esse código permite alterar as informações de um produto existente na tabela Produtos.

    private void btnAlterar_Click(object sender, EventArgs e)

    {

            CadastroEntities context = new CadastroEntities();

            int codigoProduto = Convert.ToInt32(txtProdutoID.Text);

            Produto produto = context.Produtos.First(p => p.produtoId == codigoProduto);

            produto.nomeProduto = txtProdutoNome.Text;

            produto.categoriaid = Convert.ToInt32(txtCategoriaID.Text);

            context.SaveChanges();

            lerProdutos();

    }

Após criar o contexto obtemos o código do produto informado na caixa de texto do formulário.

A seguir usamos uma expressão lambda para retornar o produto desejado e realizarmos as alterações com base nas informações do formulário.

Nesta consulta LINQ estamos usando o  operador First que retorna o primeiro elemento da seqüência que satisfaz o critério definido na expressão lambda;

O que são Expressões Lambda ?

As expressões lambda foram incluídas no VS/VB 2008/C# para dar suporte a consultas LINQ. As cláusulas Where são assim compiladas como expressões lambdas e chamadas em itens aplicáveis do seu dataset. Podem ser consideradas uma forma de delegate que pode passar ou retornar outra função.

Nota: Delegates permitem que uma classe use métodos de outra classe. Para saber mais sobre delegates leia o meu artigo: Usando Delegates

No LINQ as expressões lambda são usadas para realizar ações sobre listas de objetos e com métodos de extensão.
Uma expressão lambda é então uma função sem nome que calcula e retorna um valor único e podem ser usadas em qualquer lugar que um tipo delegate for válido.

A seguir atualizamos o grid chamando a rotina LerProdutos.

4- Delete

Usamos o código a seguir para excluir uma entidade produto existente.

   private void btnExcluir_Click(object sender, EventArgs e)

   {

            CadastroEntities context = new CadastroEntities();

            int codigoProduto = Convert.ToInt32(txtProdutoID.Text);
            Produto produto = context.Produtos.First(p => p.produtoId == codigoProduto);
            context.DeleteObject(produto);

            context.SaveChanges();

            lerProdutos();

  }

Após criar o contexto obtemos o código do produto informado na caixa de texto do formulário.

A seguir usamos uma expressão lambda para retornar o produto a excluir.

A seguir chamamos o método DeleteObject() do contexto do objeto e passamos o objeto produto e chamamos o método SaveChanges para persistir as mudanças.

Com isso concluímos a implementação das operações CRUD no nosso exemplo.

Agora vamos definir uma funcionalidade muito prática no projeto: Permitir que quando o usuário clicar no DataGridView o conteúdo da linha selecionada seja exibida nos controles TextBox do formulário;

Para fazer isso vamos usar o evento CellEnter do controle DataGridView e nele inserir o código abaixo:

        private void gdvProdutos_CellEnter(object sender, DataGridViewCellEventArgs e)

        {

            //---Quando o usuário clicar no controle , exibe o conteudo da célula referente a primeira coluna (Column=0)

           try

            {

               //codigo do produto

                codProduto = Convert.ToInt32(gdvProdutos.Rows[e.RowIndex].Cells[0].Value);

                procuraProduto(codProduto);

           }

            catch

            {}

        }

O código acima obtém o código do produto, que é valor da primeira célula da linha selecionada, e, chama a rotina procuraProduto() passando o código do produto selecionado.

A rotina procuraProduto() têm o seu código exibido a seguir:

   private void procuraProduto(int codProduto)

    {

            CadastroEntities context = new CadastroEntities();

            Produto produto = context.Produtos.First(p => p.produtoId == codProduto);
            txtProdutoID.Text = produto.produtoId.ToString();

            txtProdutoNome.Text = produto.nomeProduto;

            txtCategoriaID.Text = produto.categoriaid.ToString();

   }

Ela é responsável por a partir do código do produto selecionado, obter o produto e exibir suas informações no formulário.

Este é um exemplo básico onde eu quis mostrar como você pode usar os recursos do Entity Framework para tratar informações de um banco de dados SQL Server. Notou que não precisamos usar instruções SQL nem os objetos ADO .NET como datareader, command, adapter, dataset , etc.

Usamos apenas os recursos gerados pelo Entity Framework que realizou o mapeamento objeto relacional e permitiu esse nível de abstração onde tratamos as entidades mapeadas  e replicamos o resultado no banco de dados.

O projeto pode ser melhorado incluindo um tratamento de exceções que não foi feito para tornar mais claro o código para os iniciantes.

Seria bom também criar uma camada de acesso a dados usando o Entity Framework e assim separar da camada de apresentação.(Eu já tratei disso em diversos artigos.)

Se você não conhece o Entity Framework sugiro que leia os artigos do site na seção : Entity Framework

Simples, simples assim...

Pegue o projeto completo aqui: CRUD_EF.zip

Eu sei é apenas Entity Framework, mas eu gosto...

Referências:


José Carlos Macoratti