1
resposta

Mensagem ao executar o projeto

Ao executar o projeto é apresentado a seguinte mensagem no console de depuração: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeClasses:

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("Banda ", "Kabulosus dsafadsfadsfadsfadsf  ,  adfadsfadsfadsfafafd") { Id = 6009};

//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.Linq; using System.Text; using System.Threading.Tasks;

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

    private string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=ScreenSoundBD;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);
    }
}

}

1 resposta

Olá Isaías!

A mensagem que você está recebendo no console indica um problema de concorrência otimista (optimistic concurrency) no Entity Framework Core. Isso geralmente ocorre quando uma operação de atualização ou exclusão não encontra a entidade esperada no banco de dados, possivelmente porque ela foi modificada ou excluída por outra transação desde que foi carregada.

Aqui estão algumas sugestões para resolver esse problema:

  1. Verifique a Existência do Registro Antes de Atualizar ou Deletar: Antes de tentar atualizar ou deletar um registro, verifique se ele ainda existe no banco de dados.

    public void Atualizar(Artista artista)
    {
        var artistaExistente = context.Artistas.Find(artista.Id);
        if (artistaExistente != null)
        {
            context.Entry(artistaExistente).CurrentValues.SetValues(artista);
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("Artista não encontrado.");
        }
    }
    
    public void Deletar(Artista artista)
    {
        var artistaExistente = context.Artistas.Find(artista.Id);
        if (artistaExistente != null)
        {
            context.Artistas.Remove(artistaExistente);
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("Artista não encontrado.");
        }
    }
    
  2. Use o Mecanismo de Controle de Concorrência do EF Core: Adicione um campo de controle de versão (timestamp) à sua entidade Artista para que o EF Core possa gerenciar a concorrência otimista.

    public class Artista
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Bio { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }
    

    Certifique-se de configurar o mapeamento correto no ScreenSoundContext:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Artista>()
            .Property(a => a.RowVersion)
            .IsRowVersion();
    }
    
  3. Tratamento de Exceções de Concorrência: Capture a exceção de concorrência otimista e trate-a adequadamente.

    public void Atualizar(Artista artista)
    {
        try
        {
            context.Artistas.Update(artista);
            context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            Console.WriteLine("Concorrência otimista detectada: " + ex.Message);
        }
    }
    
    public void Deletar(Artista artista)
    {
        try
        {
            context.Artistas.Remove(artista);
            context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            Console.WriteLine("Concorrência otimista detectada: " + ex.Message);
        }
    }
    

Experimente essas sugestões e veja se alguma delas resolve o problema.

Espero ter ajudado e bons estudos!