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 agora implementar a funcionalidade para
atualizar a Distribuidora.
No projeto foi criada uma entidade de junção denominada como
FilmeDistribuidora para poder criar o
relacionamento Muitos-Para-Muitos entre as entidades 'Filme'
e 'Distribuidora' e para poder implementar as funcionalidades
relacionadas vamos criar o controlador FilmeDistribuidora na pasta
Controllers.
Este controlador terá apenas um método Action Update onde vamos definir o relacionamento Muitos para Muitos para as entidades. Para isso iremos inserir vários registros na tabela FilmeDistribuidora simultaneamente para criar esse relacionamento.
O link para este método Action foi definido na View Index do controlador FilmesController. Assim, vamos criar o relacionamento para as entidades Filme e Distribuidora clicando no botão Distribuidora no gerenciamento de filmes.
A seguir inclua código abaixo no controlador FilmeDistribuidoraController:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using XFilmes.Context; using XFilmes.Models; namespace XFilmes.Controllers; public class FilmeDistribuidoraController : Controller public IActionResult Update(int id) var filme = _context.Filmes.Where(a => a.FilmeId == id).FirstOrDefault(); [HttpPost] if (ModelState.IsValid) List<FilmeDistribuidora> filmesDistribuidoras = new List<FilmeDistribuidora>(); foreach (string d in distribution) _context.AddRange(filmesDistribuidoras); await _context.SaveChangesAsync(); return RedirectToAction("Index", "Filmes"); void GetFilmeDistribuidora(int filmeId) ViewBag.FilmeDistribuidora = filmeDistribuidora; |
Vamos entender o código :
No método Action Update, primeiro todos os registros mais
antigos de um filme serão excluídos e, em seguida, novos registros desse filme
são inseridos no banco de dados. Isso é feito para garantir que o relacionamento
Muitos-para-Muitos permaneça preciso.
Portanto, o código que exclui os registros mais antigos do filme foi definido
pelo código:
_context.RemoveRange(_context.FilmesDistribuidoras
.Where(t
=> t.FilmeId == filme.FilmeId).ToList());
Em seguida, os novos registros são inseridos com o método AddRange():
_context.AddRange(filmesDistribuidoras);
3. A variável chamada “filmesDistribuidora” é do tipo List e seu trabalho é
criar uma lista de registros a serem inseridos pelo método AddRange(). Veja o
código abaixo que está fazendo a mesma coisa explicada anteriormente:
List<FilmeDistribuidora> filmesDistribuidoras = new List<FilmeDistribuidora>();
foreach (string d in distribution)
{
var filmedistribuidoraLista = new FilmeDistribuidora()
{
FilmeId = filme.FilmeId,
DistribuidoraId = Convert.ToInt32(d)
};
filmesDistribuidoras.Add(filmedistribuidoraLista);
}
O parâmetro da Action obtém um array de strings contendo
todos os ids de distribuidoras e estes são então adicionados à variável pelo
laço foreach.
O método GetFilmeDistribuidora() busca os registros
de Distribuidora e os adiciona a um objeto List que é enviado para a View em um
objeto ViewBag. Um controle de atributo Select “multiple”
é vinculado a esses valores.
O código da View Update.cshtml que será criada na pasta /Views/FilmeDistribuidora possui o código abaixo:
@model Filme
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" /> <script> <h3 class="bg-info text-white">Cria uma Distribuidora de um filme</h3> <div asp-validation-summary="All" class="text-danger"></div> <form method="post" enctype="multipart/form-data"> |
Neste código estamos recebendo um objeto do tipo Filme como modelo : @model Filme
O controle Select é transformado em um plugin jQuery Select2. Assim, os usuários poderão selecionar vários valores de Distribuidora no controle de seleção. (Veja mais detalhes sobre este plugin aqui : https://select2.org/ )
Esse recurso nos
ajudaráo na criação do relacionamento Muitos para Muitos. O controle de seleção
é vinculado ao valor da variável ViewBag que é enviada pelo controlador:
<select
id="Distribuidora" name="Distribuidora"
asp-items="ViewBag.FilmeDistribuidora"
multiple class="form-control">
</select>
Se executarmos o projeto e acionarmos o botão distribuidora neste momento iremos obter o seguinte resultado:
Para poder ver o recurso funcionando teremos que implementar o gerenciamento das
Distribuidoras onde vamos cadastrar as
distribuidoras para isso vamos criar o controlador
DistribuidorasController.
A distribuidora vai conter informações da distribuição do filme. A entidade Distribuidora tem um relacionamento de muitos para muitos com a entidade Filme, e, usamos uma entidade de associação chamada FilmeDistribuidora para criar esse relacionamento.
Vou implementar apenas os métodos Action Create para criar uma nova distribuidora e o método action Index para exibir as distribuidoras conforme mostra o código a seguir no controlador DistribuidorasController:
using Microsoft.AspNetCore.Mvc; using XFilmes.Context; using XFilmes.Models; namespace XFilmes.Controllers; public class DistribuidorasController : Controller public IActionResult Create() [HttpPost] return RedirectToAction("Index"); public async Task<IActionResult> Index(int id) |
Note que estamos incluindo as distribuidoras e filmes para cada distribuidora :
var distribuidoras
= await _context.Distribuidoras
.Include(t=>
t.FilmesDistribuidoras)
.ThenInclude(f=>
f.Filme).ToListAsync();
Abaixo temos o código da view
Index.cshtml :
@model List<Distribuidora> <h2 class="bg-info text-white">Filmes</h2> <a asp-action="Create" class="btn btn-secondary">Criar Distribuidora</a> <table class="table table-sm table-striped"> |
O código da view Create.cshtml é o seguinte:
@model Distribuidora
<h2
class="bg-info text-white">Criar uma Distribuidora</h2>
<div
asp-validation-summary="All" class="text-danger"></div>
<form method="post"> |
Agora podemos atribuir mais de uma Distribuidora a
um filme e visualizar o resultado conforme a seguir :
1- Exibição das distribuidoras cadastradas e as selecionadas para o Filme:
2- Exibição das distribuidoras dos filmes
Com isso mostramos como definir os principais relacionamentos no EF Core.
Pegue o projeto aqui:
XFilmes.zip
(sem as referências)
"Já vos não chamarei servos, porque o servo não sabe o que faz o seu senhor;
mas tenho-vos chamado amigos, porque tudo quanto ouvi de meu Pai vos tenho
feito conhecer."
João 15:15
Referências: