Crud com Entity Framework fácil

Pessoal, este é o meu primeiro post aqui no C# Brasil.

Vou falar sobre como fazer um CRUD com Entity Framework.

Vou usar Visual Studio 2010 junto com o SQL Server Managemente Studio.

O Entity Framework 4 é o framework ORM da Microsoft que transforma objetos de negócio em dados relacionais e vice-versa. O foco do Entity Framework não é o banco de dados mas o modelo de negócios e dessa forma uma de suas tarefas e gerar o modelo conceitual a partir do modelo de banco de dados, feito este serviço o desenvolvedor não tem que lidar mais diretamente com o banco de dados mas com o modelo conceitual e o modelo de entidades.

Vamos deixar de conversar e comecar a programar.

Primeiro você deve criar um novo projeto do tipo Web Project.

Chamaremos esse projeto de CRUD. Apenas para não ficar muito extenso, mas você pode escolher o nome que quiser.

Depois que o visual studio criar o projeto, você deve adicionar um novo webform. Clicando em cima do projeto e adicionando um webforme usando master page. Chamaremos esse form de Cadastro.aspx

Depois de criado o webForm, vamos adicionar um menu Cadastro no nosso projeto.

Clique em Site.Master.

Adiciona a seguinte linha de código no projeto:

Depois de acrescentar o nosso código podemos ver como ficou o nosso layout principal.

Com o nosso menu pronto, agora vamos adicionar um modelo de dados entity.

Clique com o botão direito no projeto e adicione um novo item:

Chamaremos o model de modelo para ficar mais fácil.

Após escolher o nome o Visual Studio vai pedir para escolher uma base de dados existente ou um empty model. Vamos escolher o empty model.

Com o ORM aberto adicione uma nova entidade conforme a figura. Coloquei uma tabela bem simples.

Depois de criado o nossa entidade, vamos gerar um script sql para criar o nosso banco de dados. Clique com o botão direito do mouse no modelo e escolha Generate Database from Model.

O Visual Studio vai mostra uma tela para escolher um banco de dados. Clique em new connection. Se você tiver instalado o SQL Server Management Studio instalado, escolha o nome do servidor do mesmo, abaixo coloque o nome do banco como exemplo, como mostra a figura.

Depois clique em next, espere gerar o script e depois clique em Finish.

Após ser gerado o script clique em Execute sql. O visual Studio vai abrir a tela SQL Server Management Studio para você escolher o servidor.

Depois de criado no modelo de entidades e o banco de dados, vamos criar nosso formulário para criar nosso pequeno cadastro usando Entity Framework.

Clique em Cadastro.aspx e no modelo Source copie e cole o código abaixo:


<div class="formulario">
<table>
    <tr>
    <td>Nome:</td>
    <td><asp:TextBox ID="txtNome" runat="server"></asp:TextBox> </td>
    </tr>

    <tr>
    <td>Email</td>
    <td><asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></td>
    </tr>

    <tr>
    <td>Telefone:</td>
    <td><asp:TextBox ID="txtTelefone" runat="server"></asp:TextBox> </td>
    </tr>

</table>
    <asp:Button ID="Button1" runat="server" Text="Salvar" />

</div>

Com o código acima podemos ver o nosso layout.

Clique agora em modelo.edmx e verifique o nome do nosso entity container name.

Agora clique 2 vezes no botão salvar.

E adicione o seguinte código:


ModeloContainer ctx = new ModeloContainer();//Para acessar as nossas entidades
Cliente cliente = new Cliente();//Tabela Cliente

cliente.Nome = txtNome.Text;
cliente.Email = txtEmail.Text;
cliente.Telefone = txtTelefone.Text;

ctx.AddToClienteSet(cliente);//Usamos aqui o nosso contexto para adicionar um cliente. Podemos usar tambem o ctx.AddObjetc().

ctx.SaveChanges();//O entity não é auto-comit então devemos adicionar o savechanges.

Pronto, com apenas 7 linhas de código temos acesso ao nosso banco de dados e inserindo um cliente no mesmo.

Salve e rode o projeto. Depois de adicionar um cliente verifique no banco para saber se o mesmo está inserido.

No próximo post vou explicar como atualizar um Cadastro.

Até a próxima.

38 thoughts on “Crud com Entity Framework fácil”

  1. Pois é. Muito bom! Ainda dá pra facilitar ainda mais utilizando o ObjectDataSource ou o EntityDataSource do Asp.net. Fica a sugestão. Parabéns.

  2. Estou iniciando com o EF, acompanhei esse post e o exemplo funcionou corretamente, tenho visto vários posts sobre EF, mas todos acessando apenas um tipo de banco (sql, oracle), já que a idéia é abstrair a persistência, como eu faço para minha aplicação que inicialmente foi desenvolvida para acessar SQL acessar outro banco? Tenho que criar um model.edmx para cada tipo de banco??

  3. Amigo você vai tewr que usar um EDMX para cada banco.
    Crie uma aplicação em camadas para sua aplicação ficar organizada.

  4. Paulo henrique.

    Na segunda imagem do seu tutorial, onde vc diz:

    “Depois que o visual studio criar o projeto, você deve adicionar um novo webform. Clicando em cima do projeto e adicionando um webforme usando master page. ”

    Ai tem a imagem de vc selecionando o Web Form using Master Page.
    Não tem isso aqui no meu!
    O que eu faço?
    Abrass

  5. Clique com o botão direito do mouse em cima do projeto e escolha Add -> New Item e pronto, vai mostras os templates.

  6. E Como faz pra criar chaves estrangeiras diretamente do Visual Studio?
    Ou só tem como fazer isso dentro do SQL SERVER?

  7. Você pode sim manipular sua base de dados pelo Visual Studio.
    No solution explorer procure o seu modelo EDMX. Clique 2 vezes nele para abrir.
    Ele vai mostra suas entidades(tabelas). Para criar uma nova propriedade, clique com o botão direito em cima da entidade e escolha Add->Scalar Property. Se quiser mudar o type da propriedade vá em properties.
    Você pode verificar no toobox, componentes para efetuar o relacionamento.
    Espero ter ajudado.

  8. Encontrei uma outra forma aparentemente mais simples.
    Dentro de meu modelo EDMX, eu clico com o botao direito na Entidade que eu quero que tenha a chave estrangeira,
    vou em Add >> Association.

  9. Isso mesmo. Apenas quis fazer alusão ao toobox para você poder criar um novo banco e efetuar os relacionamentos.

  10. Cara, Entity Framework é muito interessante!
    Agente Cria uma espécie de Diagrama de Classes e dali já gera o codigo e o sql, muito bom!
    Porém encontrei uma dúvida pertinente.

    Sempre que eu crio novas tabelas ou adiciono uma nova coluna eu mando gerar o codigo SQL,
    ele apaga tudo e cria a base do zero, assim perdendo todos os cadastros. Existe algum forma
    de apenas atualizar meu banco, inserindo as colunas? Porque meu projeto é gradativo,
    vou incrementando aos poucos. Eu cliquei em “Update Model From Database” porém não entendi
    o que ele fez, apareceu uma entidade “”sysdiagrams”” no meu modelo.

    Agradeço 😉

  11. Então o que voce deve fazer. Não precisa gerar o script toda vez que vc atualizar seu banco.
    Acesse o Server Explorer(Seu banco de dados e adicione novas colunas, propriedades e etc por la) e, depois vá ao EDMX e clique em UPDATE MODEL FROM DATABASE e clique em FINISH. So isso. Ele vai verificar que vc alterou algo e atualiza.
    Abraços.

  12. Paulo Henrique Menezes,

    Muito bom, muito bom mesmo!
    Cara estou surpreendido o quanto isso é prático! rs
    Mas e se caso eu queira executar um querie complexa? Antes eu trabalhava tudo na mão
    inseria o código SQL dentro do código C# e mandava executar. Mas se agora eu nao tenho mais contato direto com
    o SQL como farei as minhas consultas? Stored Procedure? Se sim vou acessá-las como?

    Obrigado!

  13. Com certeza tem como usar StoreProcedure.
    Vou te passar um site de um cara chamado Renato Haddad ele ensina muito bem.
    La vai ter várias video aulas sobre EF4. Vai ter uma chamada: Stored Procedure Complexa no Entity Framework. Ele ensina passo a passo a criar e usar o SP.
    http://www.renatohaddad.com/aulas.aspx
    Abraços e bons estudos.

  14. Olá, estou de volta com uma dúvida que creio que seja de bastante gente que esta iniciando em EF4, HERANÇA!

    Eu fiz tudo já, modelo e banco, já criei a herença. A questão é como acessar? Como faço pra salvar os dados dentro da tabela que herda.
    No meu caso tem a Entidade Cliente, PessoaFisica e PessoaJuridica são entidades que herdam de Cliente.

    Ta assim meu codigo:

    ModeloContainer ctx = new ModeloContainer();//Para acessar as nossas entidades
    Cliente cliente = new Cliente(); //Tabela Cliente
    // PessoaFisica pf = new PessoaFisica(); //Tabela PessoaFísica

    cliente.Nome = this.txtNome.Text;
    cliente.Telefone = this.txtTelefone.Text;
    cliente.TipoTelefone = Convert.ToInt32(this.ddlTipoTelefone.SelectedValue);
    cliente.Email = this.txtEmail.Text;
    //pf.Cpf = this.txtCpf.Text;

    ctx.AddToCliente(cliente); //Usamos aqui o nosso contexto para adicionar um cliente. Podemos usar tambem o ctx.AddObjetc().

    ctx.SaveChanges();//O entity não é auto-comit então devemos adicionar o savechanges.

    Eu consigo persistir em Cliente, mas em PessoaFisica não sei como….

  15. Peço desculpas. Não tive tempo nesse final de semana. Foi só diversão. Mas vou postar hoje com o seguinte título Dados relacionado com Entity Framework.
    Abraços!

  16. O EF4 faz verificação de dados pra saber se já foi inserido um elemento igual?
    Estou cadastrando os mesmos usuários varias vezes e ele nao está relatando erro algum,
    no banco é tudo igual, mesmo a chave primária, é claro, rs.

  17. Olá amigo,
    cara, não estou conseguindo efetuar um registro em uma tabela 1:1 . Alguma idéia? Fiz uma pesquisa e só achei posts sobre como mapear na abordagem Code-First, a ainda por cima em inglês. Existe algum macete ou mágica simples ?

    Obrigadãoo!

  18. Dá esse erro:

    As entidades em ‘ModeloContainer.Atendimento’ participam da relação ‘AtendimentoTiposTratamento’. 0 ‘TiposTratamento’ relacionadas foram encontradas. Eram esperadas 1 ‘TiposTratamento’.

    Meu código (resumido):

    ModeloContainer ctx = new ModeloContainer();
    PragasEncontradas pragas = new PragasEncontradas();
    TiposTratamento tp = new TiposTratamento();
    Atendimento atm = new Atendimento();

    //Tabela Atendimento
    atm.DtChegada = this.txtDataChegada.Text.Trim();
    atm.DtSaida = this.txtHoraSaida.Text.Trim();

    //Tabela PragasEncontradas
    if (this.chkBaratas.Checked) pragas.Baratas = true;
    if (this.chkAranhas.Checked) pragas.Aranhas = true;

    //Tabela TipoTratamento
    if (this.chkPulverizacao.Checked) tp.Pulverizacao = true;
    if (this.chkDesenratizacao.Checked) tp.Desratizacao = true;

    ctx.AddToAtendimento(atm);
    ctx.AddToTiposTratamento(tp);
    ctx.AddToPragas(pragas);

    ctx.SaveChanges();

    Meu modelo ta assim:

    http://img703.imageshack.us/img703/8017/modelopa.png

  19. Rocha esse tipo de erro acontece porque a tabela Atendimento tem o id da tabela tipos de tratamento e esse campo deve ficar como Allow nulls. Porque isso ?
    Porque toda vez que vc for adicionar um atendimento, automaticamente ele vai pedir um tipo de tratamento ou virce e versa.
    Para entender melhor Exemplo: Tenho a tabela cliente e endereço. um para muitos. Eu quero adicionar um cliente sem o endereço dele. Ai na minha tabela cliente tem o idEndereço, esse campo deve aceitar Allow Nulls, se não ele sempre vai pedir para adicionar tambem um endereço.

    Espero ter ajudado. Desculpe a demora para responder.
    Abraços!

  20. Mas ai a ligação seria “0 para muitos”, não?

    Eu fico na dúvida de como funciona. Eu preciso por exemplo adicionar uma coluna da chave estrangeira manualmente, ou não é necessário isso? Eu ainda não saquei a utilidade do “Navigation Properties” ! Isso é a chave estrangeira?? Quando eu vou em adicionar uma Association ele ate me mostra a opção de add foreign key, quer dizer que não preciso adiconar manualmente as colunas de associação? Eu fico meio perdido nessas horas…

  21. Não ficaria 0 para muitos, porque o que mudaria era apenas que, como exemplo: Adicionar um cliente e um endereco. Ai você deseja adicionar somente um cliente sem endereço. Daquela forma que vc tava fazendo ele não deixa isso acontecer porque a chave estrangeira do endereco não é null. Então vc é obrigado a add um endereco também. Você vai apenas mudar de null para Allow null. No EF não existe foreing keys. Eles foram substituidos por Navigation properties.

  22. Cara, não estou conseguindo mesmo =(
    Já era pra mim ter entregue o sistema pro cliente e não consegui arrumar isso…há alguma possibilidade de te mandar o meu projeto pra que vc veja pra mim o que eu não estou vendo? Se sim, me passe o email…
    Obrigado por tudo.

  23. ….agora o problema ta sendo essa mensagem:

    A instrução INSERT conflitou com a restrição do FOREIGN KEY “FK_ClienteAtendimento”. O conflito ocorreu no banco de dados “BioVitoria”, tabela “dbo.Cliente”, column ‘IdCliente’.
    A instrução foi finalizada.

    =(

  24. Consegui resolver! Eu alterei para Alow Null o campo idCliente dentro da tabela Atendimento, e funcionou.

    Cara como faço para mudar de banco?
    Estou usando um banco na minha máquina, no SQL SERVER 2008, porém que a minha aplicação olhe para outro banco (identico) online. Já que é um sistema online, preciso fazer com que ele aponte para o banco que eu criei no servidor, ele ja esta pronto e configurado, quero saber como fazer a aplicação apontar pra esse banco online. Aonde eu altero?

  25. Rocha eu vi essa pergunta hoje. rsrs. Caramba tem muito tempo. Desculpe. Eu não recebi email desse novo comentário. Mas se ainda ajudar. è so alterar no webconfig a propriedade connectionStrings. Coloque a conexão do seu novo banco. Você pode ter vários connectionStrings apontando para diversos bancos.

  26. Amigo tenho uma dúvida, estou apanhando aqui com uma integridade referencial da seguinte forma:

    Criei uma tabela para “Email”, para que a “Pessoa” possa ter quantos forme necessários, e uma tabela “TipoEmail”, onde defini se é email Pessoal, Profissional, etc…

    Quando recebo os atributos por parâmetros para alterar por exemplo o email, não estou conseguindo popular a tabela “TipoEmail”, conforme código abaixo:

    public void Alterar(int CodigoEmail, string Descricao, int CodigoPessoa, int CodigoTipoEmail, int CodigoEmpresa)
    {
    try
    {
    validarAlterar(Descricao, CodigoTipoEmail);
    SIGAPSQLEntities bco = new SIGAPSQLEntities();
    Email obj = bco.Email.FirstOrDefault(e => e.CodigoEmail == CodigoEmail);
    if (obj == null) { throw new Exception(“Email não encontrado.”); }
    obj.Descricao = Descricao;
    obj.TipoEmail = new TipoEmail() {CodigoTipoEmail = CodigoTipoEmail};
    bco.SaveChanges();
    }
    catch (Exception ex)
    {
    throw new Exception(ex.Message.ToString());
    }
    }

    Ele sempre cria um novo tipo de email, e não estou conseguindo entender o porque, estou travado a 3 dias nessa brincadeira…..

    Agradeço muito se alguém conseguir ajudar !!!

  27. Ricardo, você ta querendo alterar um dado existente, mas ta criando um novo tipoEmail(new TipoEmail()).
    Você tem que passar apenas a referência do objeto, não criar um novo.

    coloca assim: obj.TipoEmail.CodigoTipoEmail = CodigoTipoEmail.

  28. Paulo primeiramente parabéns pelo artigo a minha duvida é sobre o AddClienteSet esse metodo eu tenho que fazer ou ele já erda do Entity? Se não como deve ser essa implementação.
    Agradeço desde já a ajuda.

Os comentários estão fechados.