Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Desafio Curso Entity Framework parte 1

Tentei realizar o desafio do Entity framework parte 1, porém no meio do caminho me perdi completamente e não sei mais o que faço

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Alura.Filmes.App.Negocio;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Alura.Filmes.App.Dados
{
    public class FilmeCategoriaConfiguration : IEntityTypeConfiguration<FilmeCategoria>
    {
        public void Configure(EntityTypeBuilder<FilmeCategoria> builder)
        {
            builder
                .ToTable("film_category");

            builder
                .Property<int>("category_id")
                .IsRequired();

            builder
                .Property<int>("film_id")
                .IsRequired();

            builder
                .Property<DateTime>("last_update")
                .HasDefaultValueSql("getdate()")
                .HasColumnType("datetime")
                .IsRequired();

            builder
                .HasKey("category_id", "film_id");

            builder
                .HasOne(fc => fc.Categoria)
                .WithMany(f => f.Filmes);

            builder
                .HasOne(fc => fc.Filme)
                .WithMany(f => f.Categoria);

        }
    }
}

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura.Filmes.App.Dados
{
    class FilmeConfiguration : IEntityTypeConfiguration<Filme>
    {
        public void Configure(EntityTypeBuilder<Filme> builder)
        {
            builder
                .ToTable("film");

            builder
                .Property(f => f.Titulo)
                .IsRequired()
                .HasColumnType("varchar(255)")
                .HasColumnName("title");

            builder
                .Property(f => f.Descricao)
                .IsRequired()
                .HasColumnName("description")
                .HasColumnType("text");

            builder
                .Property(f => f.Id)
                .HasColumnName("film_id");

            builder
                .Property(f => f.AnoLancamento)
                .IsRequired()
                .HasColumnName("release_year")
                .HasColumnType("varchar(4)");

            builder
                .Property<DateTime>("last_update")
                .IsRequired()
                .HasColumnType("datetime");

            builder
                .Property(F => F.Duracao)
                .HasColumnName("length");

            builder
                .Property<byte>("language_id")
                .IsRequired();

            builder
                .Property<byte?>("original_language_id")
                .IsRequired();

            builder
                .HasOne(f => f.IdiomaFalado)
                .WithMany(i => i.FilmesFalados)
                .HasForeignKey("language_id");

            builder
                .HasOne(f => f.IdiomaOriginal)
                .WithMany(i => i.FilmesOriginais)
                .HasForeignKey("original_language_id");


        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Alura.Filmes.App.Negocio;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Alura.Filmes.App.Dados
{
    public class CategoriasConfiguration : IEntityTypeConfiguration<Categorias>
    {
        public void Configure(EntityTypeBuilder<Categorias> builder)
        {
            builder
                .ToTable("category");

            builder
                .Property(c => c.Id)
                .HasColumnName("category_id");

            builder
                .Property(c => c.Nome)
                .HasColumnName("name")
                .HasColumnType("varchar(25)")
                .IsRequired();

            builder
                .Property<DateTime>("last_update")
                .HasDefaultValueSql("getdate()")
                .HasColumnType("datetime")
                .IsRequired();
        }
    }
}
3 respostas
solução!

Olá, Caio

Acredito que seja melhor acompanhar a explicação do instrutor naquele mesmo desafio, e ver o que está faltando fazer no seu código:

https://cursos.alura.com.br/course/entity-framework-core-banco-pre-existente-parte1/task/31103

As classes Categoria, FilmeCategoria e Filme devem ficar parecidas com o código abaixo (repare que declaramos Id como byte).

public class Categoria
{
    public byte Id { get; set; }
    public string Nome { get; set; }
    public IList<FilmeCategoria> Filmes { get; set; }

    public Categoria()
    {
        Filmes = new List<FilmeCategoria>();
    }

    public override string ToString()
    {
        return $"Categoria ({Id}): {Nome}";
    }
}

public class FilmeCategoria
{
    public Filme Filme { get; set; }
    public Categoria Categoria { get; set; }
}

public class Filme
{
    public int Id { get; set; }
    public string Titulo { get; set; }
    public string Descricao { get; set; }
    public string AnoLancamento { get; set; }
    public short Duracao { get; set; }
    public IList<FilmeAtor> Atores { get; set; }
    public IList<FilmeCategoria> Categorias { get; set; }

    public Filme()
    {
        Atores = new List<FilmeAtor>();
    }

    public override string ToString()
    {
        return $"Filme ({Id}): {Titulo} - {AnoLancamento}";
    }
}

Em seguida a classe de contexto...

public class AluraFilmesContexto : DbContext
{
    //...outras propriedades DbSet
    public DbSet<Categoria> Categorias { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //...outras configurações
        modelBuilder.ApplyConfiguration(new CategoriaConfiguration());
        modelBuilder.ApplyConfiguration(new FilmeCategoriaConfiguration());
    }
}

..., as classes de configuração...

public class CategoriaConfiguration : IEntityTypeConfiguration<Categoria>
{
    public void Configure(EntityTypeBuilder<Categoria> builder)
    {
        builder.ToTable("category");
        builder.Property(c => c.Id)
            .HasColumnName("category_id");
        builder.Property(c => c.Nome)
            .HasColumnName("name")
            .HasColumnType("varchar(25)")
            .IsRequired();
        builder.Property<DateTime>("last_update")
            .HasColumnType("datetime")
            .HasDefaultValueSql("getdate()");
    }
}

public class FilmeCategoriaConfiguration : IEntityTypeConfiguration<FilmeCategoria>
{
    public void Configure(EntityTypeBuilder<FilmeCategoria> builder)
    {
        builder.ToTable("film_category");
        builder.Property<int>("film_id");
        builder.Property<byte>("category_id");
        builder.HasKey("film_id", "category_id");
        builder
            .HasOne(fc => fc.Categoria)
            .WithMany(c => c.Filmes)
            .HasForeignKey("category_id");
        builder
            .HasOne(fc => fc.Filme)
            .WithMany(f => f.Categorias)
            .HasForeignKey("film_id");
    }
}

...e um exemplo de código para testar o mapeamento:

static void Main(string[] args)
{
    using (var contexto = new AluraFilmesContexto())
    {
        contexto.StartLogSqlToConsole();

        var categorias = contexto.Categorias
            .Include(c => c.Filmes)
            .ThenInclude(fc => fc.Filme);

        foreach (var c in categorias)
        {
            Console.WriteLine("");
            Console.WriteLine($"Filmes da categoria {c}:");
            foreach (var fc in c.Filmes)
            {
                Console.WriteLine(fc.Filme);
            }
        }

    }
}

Depois de esfriar a cabeça eu olhei de novo o código e vi que era um erro bobo meu. Já esta rodando perfeitamente, obrigado pela ajuda também, fez eu melhorar a exibição dos valores

Excelente, Caio, e obrigado por participar do fórum! Boa sorte e bons estudos!