3
respostas

Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF.

Estou com esse problema abaixo:

SqlException: Cannot insert explicit value for identity column in table 'Usuarios' when IDENTITY_INSERT is set to OFF.

Esse problema vem sendo recorrente durante todo o curso e eu pude observar que ele ocorre quando eu tento inserir um objeto dentro de um inicializador de outro objeto e ao rodar o programa, o comando SaveChanges() não permite a inserção no banco.

Nas outras ocasiões que isto ocorreu, eu simplesmente substitui um atributo do objeto que estava sendo criado pelo id discreto invés do objeto (exemplo: invés de passar um objeto inteiro de Categoria ao criar um objeto Produto, eu simplesmente passava um número id e com isso contornava o problema). Como podemos observar a seguir:

  • Invés disso ( que dá erro ao executar SaveChanges()):
Categoria categoria = contexto.Categorias.BuscaPorId(1);
// onde  o id da Categoria 1 corresponde a Informatica

Produto pErro = new Produto()
{
    Nome = "Mouse",
    Preco = 30,
    Categoria = categoria
};
  • Contornei o erro executando o seguinte:
Produto pOK= new Produto()
{
    Nome = "Mouse",
    Preco = 30,
    CategoriaID = 1
};

Ao que eu pude pesquisar, esse erro ocorre no fato de que eu estou tentando inserir um valor em uma coluna primária e o próprio EntityFramework fica encarregado de preencher o valor dessa coluna com um número incremental de acordo com a inserção.

Queria entender melhor como contornar e evitar esse problema.. Já tentei soluções como ao declarar o model, antes do atributo que será a primary key, declarar a seguinte propriedade:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Agora o problema está ocorrendo ao tentar realizar a Aula 6, ao tentar cadastrar vendas de produtos no código abaixo:

static void Main(string[] args)
        {
            EntidadeContext contexto = new EntidadeContext();
            UsuarioDao uDao = new UsuarioDao();

            Usuario user = uDao.BuscaPorId(1);

            Venda v = new Venda()
            {
                Cliente = user
            };

            Produto p = contexto.Produtos.FirstOrDefault(produto => produto.ID == 2);
            Produto p2 = contexto.Produtos.FirstOrDefault(produto => produto.ID == 3);

            ProdutoVenda pv = new ProdutoVenda()
            {
                Venda = v,
                Produto = p
            };

            ProdutoVenda pv2 = new ProdutoVenda()
            {
                Venda = v,
                Produto = p2
            };

            contexto.Vendas.Add(v);
            contexto.ProdutoVenda.Add(pv);
            contexto.ProdutoVenda.Add(pv2);

            contexto.SaveChanges(); // ERRO AQUI

            Console.ReadLine();

        }
3 respostas

Olá, Wisner!

Qual o valor da propriedade Id do user após a execução desta linha?

Usuario user = uDao.BuscaPorId(1);

Eu imagino que seja zero. É isso? Se for, o objeto Usuario não está carregando corretamente as informações do banco de dados. Por isso, para analisarmos melhor, gostaria que você postasse aqui:

  • O código da classe Usuario
  • O código do método BuscaPorId.

Obrigado!

Olá Marcelo!

Realizei o seguinte código para verificar o valor e o tipo do atributo:

 Usuario user = uDao.BuscaPorId(1);

            Console.WriteLine(user.ID + " -
 " + user.ID.GetType().ToString());

O retorno é:

1 - System.Int32

Então acredito que o retorno esteja correto, né?

Bom, como você pediu segue abaixo o código da classe Usuário juntamente com o BuscaPorId: * Usuario.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lojaComEntity.Entidade
{
    public class Usuario
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
        public string Nome { get; set; }
        public string Senha { get; set; }
    }
}
  • UsuarioDao.cs:
using lojaComEntity.Entidade;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lojaComEntity
{
    public class UsuarioDao
    {
        private EntidadeContext contexto;

        public UsuarioDao()
        {
            this.contexto = new EntidadeContext();
        }

        public void Salva(Usuario usuario)
        {
            this.contexto.Usuarios.Add(usuario);
            this.contexto.SaveChanges();
            this.contexto.Dispose();
        }

        public Usuario BuscaPorId(int id)
        {
            return this.contexto.Usuarios.FirstOrDefault(u => u.ID == id);
        }

        public void Remover(Usuario usuario)
        {
            this.contexto.Usuarios.Remove(usuario);
            this.contexto.SaveChanges();
        }

        public void SaveChanges()
        {
            this.contexto.SaveChanges();
        }
    }
}

Fico no aguardo :D

Bom, eu contornei o problema (opção 1 abaixo) mas eu realmente gostaria de saber porque eu não consigo fazer igual o Renan faz na videoaula (opção 2 abaixo).

  • Opção 1:
Usuario user = uDao.BuscaPorId(1);

            Venda v = new Venda()
            {
                ClienteID = user.ID

            };
  • Opção 2:
Usuario user = uDao.BuscaPorId(1);


            Venda v = new Venda()
            {
                Cliente = user

            };