![]() |
Neste artigo vamos continuar mostrando como definir os principais relacionamentos entre as entidades usando o EF Core em um projeto prático. |
Continuando o artigo anterior vamos iniciar a criação do controlador e das views
para gerenciar informações das Produtoras.
Para isso vamos criar na pasta Controllers o do
projeto o controlador ProdutorasController. Para
simplificar vamos injetar no construtor do controlador o contexto
AppDbContext e a interface
IWebHostEnvironment localizada no namespace
Microsoft.AspNetCore.Hosting que fornece informações sobre hospedagem na
web. Este objeto nos ajudará a carregar o logotipo da produtora dentro da pasta
wwwroot.
Essa abordagem vai dificultar a troca da ferramenta ORM pois estamos acoplando o EF Core no controlador mas simplifica o projeto que por ser um estudo de caso para mostrar como definir os relacionamentos usando o EF Core se justifica.
A seguir vamos criar o método Action Create que faz a criação real dos registros
das empresas de produção.
Para criar o controlador acione o menu Project -> Add New Item;
A seguir selecione ASP.NET Core e o template MVC
Controller -Empty informando o nome ProdutorasController:
A seguir inclua o código abaixo :
using Microsoft.AspNetCore.Mvc;
namespace XFilmes.Controllers;
public class
ProdutorasController :
Controller
public
ProdutorasController(AppDbContext mc, IWebHostEnvironment environment)
public
ActionResult<List<Produtora>> Index()
public IActionResult Create()
[HttpPost]
if (ModelState.IsValid)
var produtoraNova = new Produtora()
context.Add(produtoraNova);
return RedirectToAction("Index");
public IActionResult Update(int id)
[HttpPost]
var produtoraAtualizada = new Produtora()
context.Update(produtoraAtualizada);
return RedirectToAction("Index");
[HttpPost]
context.Remove(pc); await context.SaveChangesAsync();
return RedirectToAction("Index"); |
Neste controlador injetamos a instância do contexto e de
IWebHostEnvironment no construtor e criamos os
seguintes métodos Action :
1. Index - Exibe a lista de
produtoras
2. Create - Permite criar nova uma
produtora
3. Update - Permite atualizar uma produtora
4. Delete - Permite deletar uma produtora
As respectivas views foram criadas na pasta /Views/Produtoras :
Abaixo temos o código da view
Index.cshtml :
@model List<Produtora> <h1 class="bg-info text-white">Produtoras</h1> <a asp-action="Create" class="btn btn-secondary">Criar Nova Produtora</a> <table class="table table-sm table-striped"> |
A view Index exibe a relação
de produtoras e permite realizar as operações CRUD os métodos
Action Update e Delete.
Para exibir as imagens usamos uma tag HTML img : <img src="/images/produtoras/@Url.Content(pc.Logo)"
Temos assim criada na pasta wwwroot
a pasta produtoras contendo as imagens das
produtoras.
Implementando o gerenciamento de Filmes
Os recursos para gerenciar um filme incluem as operações CRUD como
criação, leitura, atualização e exclusão de registros de filmes. Vamos criar 4
métodos Action para realizar cada uma dessas operações.
Index
Create
Update
Delete
Observe que haverá um relacionamento
Um-para-Muitos entre as entidades Produtora e
Filme, isso significa que 1 produtora pode ter muitos filmes
associados a ela. E assim teremos que exibir a relação das produtoras no
cadastro de um filme.
Veremos como tratar esses relacionamentos implementando o
controlador, os métodos Actions e as respectivas views.
Vamos criar o controlador FilmesController na pasta Controllers com o código abaixo:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using XFilmes.Context; using XFilmes.Models; namespace XFilmes.Controllers; public class FilmesController : Controller public FilmesController(AppDbContext mc, IWebHostEnvironment environment) public IActionResult Index() public IActionResult Create() [HttpPost] if (Poster == null) if (ModelState.IsValid) var filmeNovo = new Filme() context.Add(filmeNovo); return RedirectToAction("Index"); public IActionResult Update(int id) return View(filme); [HttpPost] if (ModelState.IsValid) var filmeAtualizado = new Filme() context.Update(filmeAtualizado); return RedirectToAction("Index"); [HttpPost] void GetProdutoras() ViewBag.Produtoras = produtoras; |
Neste código destacamos que:
Injetamos o contexto e a interface IWebHostEnvironment no construtor do controlador.
Para carregar todos os filmes e suas produtoras associadas usamos o método Include:
var filmes = context.Filmes.Include(p=> p.Produtora).ToList();
E para exibir a relação das produtoras já cadastradas criamos o método GetProdutoras:
void GetProdutoras()
{
List<SelectListItem> produtoras = new List<SelectListItem>();
produtoras = context.Produtoras.Select(x => new SelectListItem
{
Text = x.Nome, Value = x.ProdutoraId.ToString()
}).ToList();
ViewBag.Produtoras = produtoras;
}
Este método preenche a ViewBag.Produtoras que iremos usar para exibir a relação de produtoras nas Views Create e Update.
No método Delete cabe destacar que no arquivo de contexto
declaramos o comportamento de exclusão como em cascata :
.OnDelete(DeleteBehavior.Cascade);
Isso significa que se o registro do filme for excluído, os registros
relacionados da tabela Distribuidora serão excluídos automaticamente. Confira
este artigo para obter mais informações a esse respeito.
As respectivas views foram criadas na pasta /Views/Filmes.
Abaixo temos o código da view
Index.cshtml :
@model List<Filme> <h1 class="bg-info text-white">Filmes</h1> <a asp-action="Create" class="btn btn-secondary">Criar Filme</a> <table class="table table-sm table-striped"> |
A view Index exibe a relação de filmes e permite
realizar as operações CRUD usando os métodos Action Update
e Delete.
Para exibir as imagens usamos uma tag HTML img : <img src="/images/filmes/@Url.Content(filme.Poster)"
Temos assim criada na pasta wwwroot
a pasta filmes contendo as imagens dos filmes.
Na próxima parte do artigo vamos continuar implementando a
funcionalidade para a atualizar a distribuidora....
"Que diremos, pois, a estas coisas? Se Deus é por nós,
quem será contra nós? "
Romanos 8:31
Referências: