Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao inserir promocao na tabela Promocoes no banco

Durante a execução do meu código para salvar a promoção no banco, o mesmo me retorna o erro "SqlException: Cannot insert explicit value for identity column in table 'Produtos' when IDENTITY_INSERT is set to OFF."

Segue cód das classes abaixo.

static void Main(string[] args)
        {
            var promocao = new Promocao();
            promocao.Descricao = "Semana Gamer";
            promocao.DataInicio = new DateTime(2020, 7, 1);
            promocao.DataInicio = promocao.DataInicio.AddDays(7);

            var produtos = new ProdutoDAOEntity()
                .GetProdutos()
                .Where(p => p.Categoria == "Games")
                .ToList();

            foreach (var produto in produtos)
            {
                promocao.IncluirProduto(produto);
            }

            using (var contexto = new LojaContexto())
            {
                contexto.Promocoes.Add(promocao);
                contexto.SaveChanges();
            }
}
public class Promocao
    {

        public int Id { get; set; }
        public string Descricao { get; set; }
        public DateTime DataInicio { get; set; }
        public DateTime DataTermino { get; set; }
        public IList<PromocaoProduto> Produtos { get; set; }

        public Promocao()
        {
            Produtos = new List<PromocaoProduto>();
        }

        public void IncluirProduto(Produto produto)
        {
            Produtos.Add(new PromocaoProduto() { Produto = produto });
        }
    }
public class Produto
    {
        public int Id { get; internal set; }
        public string Nome { get; internal set; }
        public string Categoria { get; internal set; }
        public double PrecoUnidade { get; internal set; }
        public string Unidade { get; set; }
        public IList<PromocaoProduto> Promocoes { get; set; }

        public override string ToString()
        {
            return $"Produto: {Nome}, Categoria: {Categoria}, Preço: {PrecoUnidade}";
        }
    }
public class PromocaoProduto
    {
        public int ProdutoId { get; set; }
        public Produto Produto { get; set; }
        public int PromocaoId { get; set; }
        public Promocao Promocao { get; set; }
    }
class LojaContexto : DbContext
    {
        public DbSet<Produto> Produtos { get; set; }
        public DbSet<Compra> Compras { get; set; }
        public DbSet<Promocao> Promocoes { get; set; }
        public DbSet<Cliente> Clientes { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder
                .Entity<PromocaoProduto>()
                .HasKey(pp => new { pp.PromocaoId, pp.ProdutoId });

            modelBuilder
                .Entity<PromocaoProduto>()
                .HasOne(pp => pp.Produto)
                .WithMany(pp=> pp.Promocoes)
                .HasForeignKey(pp => pp.ProdutoId);

            modelBuilder
                .Entity<PromocaoProduto>()
                .HasOne(pp => pp.Promocao)
                .WithMany(pp => pp.Produtos)
                .HasForeignKey(pp => pp.PromocaoId);

            modelBuilder
                .Entity<Endereco>()
                .ToTable("Enderecos");

            modelBuilder
                .Entity<Endereco>()
                .Property<int>("ClienteId");

            modelBuilder
                .Entity<Endereco>()
                .HasKey("ClienteId");
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=LojaDB;Trusted_Connection=true;");
        }
    }
1 resposta
solução!

Olá marcelo,

Tudo bem?

O que acontece é que o seu SQL não está permitindo você cadastrar o ID manualmente, pois ele deve ser um inteiro auto increment na definição da sua tabela. Ou você retira essa parte que insere o ID junto com o cadastro de uma nova promoção ou voce ativa o IDENTITY_INSERT para a tabela em questão.

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