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!