1
resposta

Tive problemas no curso .NET: persistindo dados com Entity Framework Core

Estou tendo este problema após ter terminado a aula Refatorando ArtistaDAL: An error occurred while saving the entity changes.

Aqui estão meus códigos:

Program.cs:

using ScreenSound.Banco;
using ScreenSound.Menus;
using ScreenSound.Modelos;

try
{
    var context = new ScreenSoundContext();
    var artistaDAL = new ArtistaDAL(context);

    var novoArtista = new Artista("Creepy Nuts", "Creepy Nuts é uma dupla japonesa de Hip Hop composta por R-Shitei e DJ Matsunaga. R-Shitei, cujo nome de rap significa “R-Rated”, canta rimas aceleradas sobre as faixas cativantes de seu parceiro. A dupla foi formada em 2013 e lançou seu primeiro mini-álbum em janeiro de 2016.");
    
    artistaDAL.Adicionar(novoArtista);
    //artistaDAL.Atualizar(novoArtista);
    //artistaDAL.Deletar(novoArtista);


    var listaArtistas = artistaDAL.Listar();

    foreach (var artista in listaArtistas)
    {
        Console.WriteLine(artista);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

return;

Artista ira = new Artista("Ira!", "Banda Ira!");
Artista beatles = new("The Beatles", "Banda The Beatles");

Dictionary<string, Artista> artistasRegistrados = new();
artistasRegistrados.Add(ira.Nome, ira);
artistasRegistrados.Add(beatles.Nome, beatles);

Dictionary<int, Menu> opcoes = new();
opcoes.Add(1, new MenuRegistrarArtista());
opcoes.Add(2, new MenuRegistrarMusica());
opcoes.Add(3, new MenuMostrarArtistas());
opcoes.Add(4, new MenuMostrarMusicas());
opcoes.Add(-1, new MenuSair());

void ExibirLogo()
{
    Console.WriteLine(@"

░██████╗░█████╗░██████╗░███████╗███████╗███╗░░██╗  ░██████╗░█████╗░██╗░░░██╗███╗░░██╗██████╗░
██╔════╝██╔══██╗██╔══██╗██╔════╝██╔════╝████╗░██║  ██╔════╝██╔══██╗██║░░░██║████╗░██║██╔══██╗
╚█████╗░██║░░╚═╝██████╔╝█████╗░░█████╗░░██╔██╗██║  ╚█████╗░██║░░██║██║░░░██║██╔██╗██║██║░░██║
░╚═══██╗██║░░██╗██╔══██╗██╔══╝░░██╔══╝░░██║╚████║  ░╚═══██╗██║░░██║██║░░░██║██║╚████║██║░░██║
██████╔╝╚█████╔╝██║░░██║███████╗███████╗██║░╚███║  ██████╔╝╚█████╔╝╚██████╔╝██║░╚███║██████╔╝
╚═════╝░░╚════╝░╚═╝░░╚═╝╚══════╝╚══════╝╚═╝░░╚══╝  ╚═════╝░░╚════╝░░╚═════╝░╚═╝░░╚══╝╚═════╝░
");
    Console.WriteLine("Boas vindas ao Screen Sound 3.0!");
}

void ExibirOpcoesDoMenu()
{
    ExibirLogo();
    Console.WriteLine("\nDigite 1 para registrar um artista");
    Console.WriteLine("Digite 2 para registrar a música de um artista");
    Console.WriteLine("Digite 3 para mostrar todos os artistas");
    Console.WriteLine("Digite 4 para exibir todas as músicas de um artista");
    Console.WriteLine("Digite -1 para sair");

    Console.Write("\nDigite a sua opção: ");
    string opcaoEscolhida = Console.ReadLine()!;
    int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida);

    if (opcoes.ContainsKey(opcaoEscolhidaNumerica))
    {
        Menu menuASerExibido = opcoes[opcaoEscolhidaNumerica];
        menuASerExibido.Executar(artistasRegistrados);
        if (opcaoEscolhidaNumerica > 0) ExibirOpcoesDoMenu();
    } 
    else
    {
        Console.WriteLine("Opção inválida");
    }
}

ExibirOpcoesDoMenu();

ArtistaDAL.cs:

using Microsoft.Data.SqlClient;
using ScreenSound.Modelos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ScreenSound.Banco;
internal class ArtistaDAL
{
    private readonly ScreenSoundContext context;

    public ArtistaDAL(ScreenSoundContext context)
    {
        this.context = context;
    }

    public IEnumerable<Artista> Listar()
    {
        return context.Artistas.ToList();
        
    }

    public void Adicionar(Artista artista)
    {
        context.Artistas.Add(artista);
        context.SaveChanges();

    }

    public void Atualizar(Artista artista)
    {
        context.Artistas.Update(artista);
        context.SaveChanges();

    }

    public void Deletar(Artista artista)
    {
        context.Artistas.Remove(artista);
        context.SaveChanges();

    }
}

ScreenSoundContext.cs:

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using ScreenSound.Modelos;
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ScreenSound.Banco;

internal class ScreenSoundContext: DbContext
{
    public DbSet<Artista> Artistas { get; set; }

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

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
    }
  
    
}
1 resposta

Olá, Gabriel! Tudo bem?

Peço desculpa pela demora em responder o seu tópico.

Você seguiu corretamente as instruções da aula para refatorar o ArtistaDAL, e os códigos que você compartilhou não apresentam nenhuma inconsistência

A mensagem de erro "An error occurred while saving the entity changes" geralmente ocorre quando há algum problema com as entidades que estão sendo salvas no banco de dados. Isso pode ser causado por várias razões, como problemas de mapeamento, violações de restrições do banco de dados, entre outros.

Para diagnosticar o problema, você pode tentar capturar a exceção e imprimir a pilha de chamadas para obter mais detalhes sobre o erro. Você pode fazer isso modificando o bloco catch no seu arquivo Program.cs para algo assim:

catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    Console.WriteLine(ex.StackTrace);
}

Isso deve fornecer mais detalhes sobre o erro que está ocorrendo.

Além disso, verifique se o banco de dados que você está tentando acessar existe e está acessível. Você pode fazer isso verificando a string de conexão no seu arquivo ScreenSoundContext.cs.

Caso não consiga resolver esse problema peço que compartilhe todo o seu projeto, pode ser que outras partes do seu código esteja causando esse erro. Você pode compartilhar o seu projeto via GitHub ou Drive do Google.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.