Hoje vamos criar uma pequena aplicação totalmente didádica para criar um CRUD usando o Entity Framework com o ASP NET MVC.
1. Criando a aplicação
Crie um novo projeto web, clique em File -> New Project
Depois selecione Visual C# -> Web -> ASP.NET MVC 2 Web Application e adione um nome (ExemploEF_MVC) e clique em OK.
2. Criando um edmx
Agora vamos adicionar ao projeto um arquivo ADO.NET Entity Data Model que serve para configurar a conexão com o banco e também para fazer o mapeamento do nossas tabelas em classes.
Clique com o botão direito em cima do projeto e selecione a opção Add -> New Item
Selecione a opção Visual C# -> Data -> ADO.NET Entity Data Model e adicione um nome.
Selecione a opção Generate from database e clique em Next
Configure a conexão com a base e clique em Next
Selecione as tabelas que deseja mapear, e clique em Finish
Veja que esse é um pequeno exemplo por esse motivo temos apenas uma tabela para testes.
3. Criando o Controller
Agora vamos criar um novo controller, clique com o botão direito em cima da pasta Controllers e selecione a opção Add -> Controller
Coloque o nome de ContatoController e selecione a opção para criar os actions métodos e clique em Add
Veja que os métodos básicos foram criados automaticamente
4. Codificando action Index
A action Index será responsável por listar os dados, veja abaixo o código.
public ActionResult Index()
{
contatosEntities entidades = new contatosEntities();
List<contato> lst = entidades.CreateObjectSet<contato>().ToList<contato>();
return View(lst);
}
Depois de criado a action, vamos adicionar uma view Index, para isso clique com o botão direito em cima da action e selecione a opção Add View
Depois temos que fazer algumas configurações para a view
- Selecione a opção Create a strongly-typed view
- Em View data class selecione a classe que foi criada através do Entity, nesse caso ExemploEF_MVC.contato
- Em View content selecione a opção List
Vamos compilar o projeto e verificar o resultado.
5. Codificando action Details
A action Details será responsável por mostar um registro específico, veja abaixo o código.
public ActionResult Details(int id)
{
contatosEntities entidades = new contatosEntities();
contato obj = entidades.CreateObjectSet<contato>().Where(a => a.id_contato == id).ToList().First();
return View(obj);
}
Agora vamos adicionar uma nova view conforme demostrado acima, porém na opção View content selecione a opção Details.
Execute o projeto e clique no link Details para ver o resultado.
6. Codificando action Create
A action Create será responsável por salvar um novo registro na base de dados, temos duas actions Create a primeira tem a função de retornar a View e outra é responsável por recuperar os dados do formulário.
Primeiramente vamos implementar a action que vai retornar uma nova view, adicione uma nova view conforme demostrado acima, porém na opção View content selecione a opção Create.
Agora vamos implementar a action que vai recuperar os dados do formulário e persistir na base de dados, veja abaixo o código:
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
contato entity = new contato();
entity.nome = collection["nome"].ToString();
entity.endereco = collection["endereco"].ToString();
entity.data_nascimento = Convert.ToDateTime(collection["data_nascimento"]);
contatosEntities entidades = new contatosEntities();
entidades.AddObject(entity.GetType().Name, entity);
entidades.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Execute o projeto e clique no link Create new para ver o resultado.
7. Codificando action Edit
A action Edit será responsável por mostar um registro específico para alterar seu conteúdo, também possui duas actions Edit, uma para mostar a view e outra para recuperar os dados do formulário.
Primeiramente vamos implementar a action que vai retornar uma nova view com o registro selecionado, veja o código abaixo
public ActionResult Edit(int id)
{
contatosEntities entidades = new contatosEntities();
contato entity = entidades.CreateObjectSet<contato>().Where(a => a.id_contato == id).ToList().First();
return View(entity);
}
Adicione uma nova view conforme demostrado acima, porém na opção View content selecione a opção Edit.
Agora vamos implementar a action que vai recuperar os dados do formulário e persistir na base de dados, veja que primeiramente recuperamos o registro da base e depois alteramos, veja abaixo o código:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
contatosEntities entidades = new contatosEntities();
contato entity = entidades.CreateObjectSet<contato>().Where(a => a.id_contato == id).ToList().First();
// Altera os dados
entity.nome = collection["nome"].ToString();
entity.endereco = collection["endereco"].ToString();
entity.data_nascimento = Convert.ToDateTime(collection["data_nascimento"]);
entidades.ApplyCurrentValues<contato>(entity.GetType().Name, entity);
entidades.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Execute o projeto e clique no link Edit para ver o resultado.
8. Codificando action Delete
Finalmente vamos criar a action Delete que será responsável por deletar um registro específico, também possui duas actions, uma para mostar a view e outra para recuperar os dados do formulário.
Primeiramente vamos implementar a action que vai retornar uma nova view com o registro selecionado, veja o código abaixo.
public ActionResult Delete(int id)
{
contatosEntities entidades = new contatosEntities();
contato entity = entidades.CreateObjectSet<contato>().Where(a => a.id_contato == id).ToList().First();
return View(entity);
}
Adicione uma nova view conforme demostrado acima, porém na opção View content selecione a opção Delete.
Será criada uma view pedindo a confirmação para deletar o registro, quando clicar no botão Delete a action será acionada, veja o código abaixo.
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
// TODO: Add delete logic here
contatosEntities entidades = new contatosEntities();
contato entity = entidades.contato.Single(a => a.id_contato == id);
entidades.DeleteObject(entity);
entidades.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Execute o projeto e clique no link Delete para ver o resultado.
Conclusão
Podemos concluir que implementar um sistema com Entity Framework é muito produtivo já que não é necessário gastar tempo criando os SQLs para rodar no BD, outra vantagem é a fácil integração com o MVC.
Até a próxima!






















Preciso de uma ajuda! Ao compilar estou sendo redirecionado para uma outra página… Não consigo abrir as páginas criadas… Como resolvo isso. (Sou iniciantíssimo no mvc!) Poderia me dar mais detalhes? Obrigado
Helio,
Não consegui compreender seu problema, como assim redirecionando para outra pagina? que pagina?
Quando vc compila o projeto (F5) no VS ele tem que abir a pagina INDEX do projeto….
Favor me explicar melhor que esta acontecendo!
att,
Leandro Prado
Ele abre uma página index, Ao criar o projeto ele já criou uma página index na pasta Home e criou outro index na pasta cliente (o meu projeto eu criei o contatos com o nome de cliente.) Quando compilo e executo ele só abre a primeira pagina index (default), eu não tenho acesso a mais nenhuma pagina. Eu segui passo a passo, ficou igualzinho, mas não apareceu o botão Cliente (no seu aparece contato), e eu não sei porque ficou assim, onde está o meu erro, ou teria que alterar em algum outro local ?! Obrigado.
haaa entendi..
tente acessar pela URL o endereco do seu controller
EX: http://localhost:6447/Pessoa -> automaticamente chama a pagina index
http://localhost:6447/Pessoa/Create -> automaticamente chama a pagina create
http://localhost:6447/Pessoa/Details/10 -> automaticamente chama a pagina details
agora para aparecer o menu na pagina principal tem vai em Views/Shared/Site.Master e adicione um novo item no menu..
< %: Html.ActionLink("Home", "Index", "Home")%> < %: Html.ActionLink("Pessoa", "Index", "Pessoa")%> < %: Html.ActionLink("About", "About", "Home")%>att,
Leandro Prado
Resolvi o problema. Incluí no arquivo site.master na pasta shared o seguinte comando:
mas ao executar f5 esta retornando erro que a página não pode ser aberta. ?????
Leandro, boa tarde!
Voce teria um exemplo com tabelas relacionadas ?
Estou apanhando um pouco porque não tenho conhecimento de SQL.
Obrigado
Helio,
Esta no forno um post sobre entidades relacionadas….
final de semana vou terminar e no máximo segunda feira esta no ar..
att,
Leandro Prado
Veja se esse exemplo.. Entity Framework 4 – Code First
att,
Leandro Prado
Boa noite Leandro Prado.
Primeiramente gostaria de parabeniza-lo pelo blog e os otimos artigos e gostaria também de pedir seu auxilio com um problema que estou enfretando ao tentar fazer este exemplo.
Em projeto ASP.NET MVC, quado dou um Add View em ActionResult, seleciono “Createa strongly-typed view”, defino o “View data class” como ExemploEF_MVC.contato mas o “View content” aparece “Empty” travado não me dando opção de alterar para List.
Alguma ideia doque possa estar ocorrendo?
Muito obrigado e abraço;
José,
Esse erro nunca aconteceu comigo….
Se você criar um projeto do zero também ocorre esse erro?
att,
Leandro Prado
Sim, já tentei varias vezes criar do zero mas sem sucesso.
Muito obrigado e abraço;
ichi..
tentou executar o VS como administrador?
eu tentaria reinstalar o ASP NET MVC e se mesmo assim der erro tentar reinstalar o VS
att,
Leandro Prado
Tentei instalar e desinstar ambos mas não deu certo, ai fiz uma ultima tentativa do zero mas antes coloquei dados na tabela contato e deu certo!
Muito obrigado pela força e pela sua atenção.
Abraço,
Quando Tento Executar a Página Ocorre:
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.
Porém já vi tudo e Aparentemente está tudo certo.
sabe o que pode ser?
Obrigado!
Rafael
Esta retornando erro 404 isso quer dizer que não esta achando sua pagina.. verifique se a pagina existe… ou se o redirect esta certo… algo do tipo…
att
Leandro Prado
Olá, tudo bem?
Tive o seguinte problema:
Ao tentar criar a View, não aparece nenhum objeto para ser escolhido na opção View data Class. E, mesmo digitando o nome da classe, no View COntext sempre fica Empty.
Robson,
Para a classe aparecer tem que primeiramente compilar a aplicação
att,
Leandro Prado
Como proceder para editar campos que são chave estrangeira em um modelo EF ou LINQ TO SQL?
Rubem
A melhor opção é sempre carregar o objeto em memória e depois alterar as informações que deseja e depois persistir as alterações no banco
att,
Leandro Prado
Leandro, eu me refereria à melhor forma de editá-los no formulário, ou seja, a criação de um campo estilo combobox para um campo de lookup. Alguns chamam de listmenu, outros chamam de lookupcombobox, ou de dropdownlist. Sacou?
Sds.
saquei Rubem
Depende muito de cada tela, quando o usuário pode selecionar apenas 1 item uso uma ComBox, ou um RadioButtom, agora quando o usuário pode selecionar mais de 1 item uso uma ListBox ou até mesmo uma Grid para ir adicionando os itens
Espero q agora tenho respondido sua dúvida!
att,
Leandro Prado
Parabéns Leandro, ótimo tutorial.
Leandro,
Muito bom o post. Eu uso o EF4 e agora estou usando tb com MVC. O post me ajudou muito.
Mas eu criei uma interface para esse CRUD e etc, e neste projeto eu TENHO que utilizar o .NET 3.5, MVC 2 e EF3.5 (v1). Ou seja, vou fazer um downgrade da minha estrutura.
Sabe me dizer se o EF3.5 (v1) é bem parecido com o 4?. Conheço mais o 4 do que a versão antiga. Tem alguma referencia de uso do EF1 com MVC2?
No EF1 eu consigo fazer como no EF4 em se tratando de “selects” ?
Tem diferenças, eu entendo. Mas se possível, gostaria q vc desse uma explanada sobre estas minhas dúvidas, se é que me entendeu. Acho q não soube me expressar bem rs.
Obrigado Leandro. Sempre acabo tirando dúvidas no seu blog e hoje resolvi tirar essa dúvida genérica, mas importante.
Tiago
Tiago
Creio que não tenha muitas diferenças entre essas duas versões do EF, a forma de executar as querys continuam iguais, o que pode ter mudado é a parte de Code First
Mas porque você não pode usar o EF4? Não vale a pena migrar o projeto para .NET 4.0?
att,
Leandro Prado
Por que as pessoas insistem em fazer CRUD sem campos de pesquisa?????
para deixar a pesquisa para os “usuários” fazerem.. hehehehe