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

Retirar o construtor da CLASSE ARTISTA

Quado eu fiz https://localhost:7023/Artistas/Pitty, apareceu o seguinte error na tela do console:

An unhandled exception occurred while processing the request. NotSupportedException: The deserialization constructor for type 'Castle.Proxies.ArtistaProxy' contains parameters with null names. This might happen because the parameter names have been trimmed by ILLink. Consider using the source generated serializer instead.

Pesquisei e achei a solução, RETIREI O CONSTRUTOR da classe artista e defini seus valores como vazios, ficando da seguinte forma:

namespace ScreenSound.Modelos; 

public class Artista 
{
    public virtual ICollection<Musica> Musicas { get; set; } = new List<Musica>();

    public string Nome { get; set; } = "";
    public string FotoPerfil { get; set; } = "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png";
    public string Bio { get; set; } = "";
    public int Id { get; set; }

    public void AdicionarMusica(Musica musica)
    {
        Musicas.Add(musica);
    }

    public void ExibirDiscografia()
    {
        Console.WriteLine($"Discografia do artista {Nome}");
        foreach (var musica in Musicas)
        {
            Console.WriteLine($"Música: {musica.Nome} - Ano de Lançamento: {musica.AnoLancamento}");
        }
    }

    public override string ToString()
    {
        return $@"Id: {Id}
            Nome: {Nome}
            Foto de Perfil: {FotoPerfil}
            Bio: {Bio}";
    }
}

E depois disso deu certo, porém não entendi o pq que a presença do cosntrutor fazia aparecer esse erro. O que seria serrialização e deserialização?

3 respostas
solução!

Oii Rafaela, tudo bem?

Você está indo muito bem!

A serialização é o processo de transformar objetos em um formato que pode ser facilmente armazenado ou transmitido e, posteriormente, reconstruído. No caso do .NET, a serialização geralmente transforma um objeto em uma sequência de bytes, que pode ser facilmente armazenada ou transmitida.

A deserialização é o processo inverso, ou seja, transforma a sequência de bytes de volta em um objeto.

O erro que você estava recebendo está relacionado à deserialização. Quando o ASP.NET recebe uma solicitação HTTP, ele precisa deserializar os dados recebidos para transformá-los em objetos que o seu código pode manipular. No seu caso, estava tentando deserializar os dados em um objeto da classe Artista.

O erro diz que o construtor da classe Artista tem parâmetros com nomes nulos. Isso pode ocorrer quando os nomes dos parâmetros foram removidos por uma ferramenta chamada ILLink durante a compilação. O ILLink é uma ferramenta que o .NET usa para reduzir o tamanho do código compilado, removendo partes do código que não são usadas. Nesse processo, pode acabar removendo os nomes dos parâmetros do construtor, o que causa o erro na deserialização.

Ao remover o construtor da classe Artista, você resolveu o problema porque o .NET pode usar o construtor padrão (sem parâmetros) para criar uma nova instância da classe durante a deserialização.

Espero ter ajudado.

Um abraço e bons estudos.

Pode voltar a usar o contrutor porem tem que desabilitar o UseLazyLoadingProxies, no geral resolve

Resolvendo de vez o problema

namespace ScreenSound.Banco; public class ScreenSoundContext: DbContext { public DbSet Artistas { get; set; } public DbSet Musicas { get; set; }

private string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=ScreenSoundV0;Integrated Security=True;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False";

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer(connectionString)
        .UseLazyLoadingProxies(false); 
}

}

Ou voce pode simplesmente adicionar um construtor vazio com o atalho ctor

public Artista()
{

}