1
resposta

Desafio mapeamento n-m usando annotations

Bom dia!

Fiz o desafio de FilmeCategoria da mesma forma que foi feito em FilmeAtor e funcionou.

Daí tentei fazer colocando os Ids na classe FilmeCategoria:

FilmeCategoria.cs:

public class FilmeCategoria
    {
            public int FilmeId { get; set; }
            public byte CategoriaId { get; set; }
            public Filme Filme { get; set; }
            public Categoria Categoria { get; set; }
    }

FilmeCategoriaConfiguration.cs:

public void Configure(EntityTypeBuilder<FilmeCategoria> builder)
        {
            builder.ToTable("film_category");
            builder
                .Property(fc => fc.FilmeId)
                .HasColumnName("film_id");
            builder
                .Property(fc => fc.CategoriaId)
                .HasColumnName("category_id");
            builder
                .HasKey(fc => new { fc.FilmeId, fc.CategoriaId });
        }

E mesmo sem colocar HasOne, WithMany e HasForeingKey, funcionou.

Mas daí, tentei fazer com annotation (padrão que uso no trabalho, apesar de lá ser EF6). Não consegui definir a chave composta com annotation, então "mesclei os dois", defini o que foi possível com annotation e o que não foi no OnModelCreating. Isso seria possível? Não funcionou e não consegui entender o erro. Pode me ajudar? Segue código usando EFCore:

FilmeCategoria.cs:

using System;
using System.ComponentModel.DataAnnotations.Schema;

namespace Alura.Filmes.App.Negocio
{
    [Table("film_category")]
    public class FilmeCategoria
    {
        //[Key] //Exceção Sem Tratamento: System.InvalidOperationException: Entity type 'FilmeCategoria' has composite primary key defined with data annotations. To set composite primary key, use fluent API.
        [Column("film_id")]
        public int FilmeId { get; set; }

        //[Key] //Exceção Sem Tratamento: System.InvalidOperationException: Entity type 'FilmeCategoria' has composite primary key defined with data annotations. To set composite primary key, use fluent API.
        [Column("category_id")]
        public byte CategoriaId { get; set; }

        [ForeignKey("film_id")]
        public Filme Filme { get; set; }

        [ForeignKey("category_id")]
        public Categoria Categoria { get; set; }

        [Column("last_update")]
        public DateTime UltimaAtualizacao { get; set; }
    }
}

FilmeCategoriaConfiguration.cs:

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
                .HasKey(fc => new { fc.FilmeId, fc.CategoriaId });
        }

Program.cs:

namespace Alura.Filmes.App
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var contexto = new AluraFilmesContexto())
            {
                contexto.LogSQLToConsole();
                var filme = contexto
                    .Filmes
                    .Include(f => f.CategoriasDoFilme)  //o erro ocorre aqui
                    .First();
                Console.WriteLine(filme);
                Console.WriteLine("Categorias:");
                foreach (var item in filme.CategoriasDoFilme)
                {
                    Console.WriteLine(item);
                }

Trecho do erro:

Exceção Sem Tratamento: System.IndexOutOfRangeException: O índice estava fora dos limites da matriz.
   em lambda_method(Closure , ValueBuffer )
   em Microsoft.EntityFrameworkCore.ChangeTracking.Internal.SimpleNonNullableDependentKeyValueFactory`1.TryCreateFromBuffer(ValueBuffer valueBuffer, TKey& key)
   em Microsoft.EntityFrameworkCore.Query.Internal.PrincipalToDependentIncludeComparer`1.ShouldInclude(ValueBuffer valueBuffer)
   em Microsoft.EntityFrameworkCore.Query.Internal.QueryBuffer.IncludeCollection(Int32 includeId, INavigation navigation, INavigation inverseNavigation, IEntityType targetEntityType, IClrCollectionAccessor clrCollectionAccessor, IClrPropertySetter inverseClrPropertySetter, Boolean tracking, Object entity, Func`1 relatedEntitiesFactory)
   em lambda_method(Closure , QueryContext , Filme , Object[] )
   em Microsoft.EntityFrameworkCore.Query.Internal.IncludeCompiler._Include[TEntity](QueryContext queryContext, TEntity entity, Object[] included, Action`3 fixup)
...

Obrigada!

1 resposta
O post foi fechado por inatividade. Para continuar o assunto, recomendamos criar um novo tópico. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software