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

{"The entity type 'Cliente' requires a primary key to be defined."}

Pessoal boa noite, estou com esse erro, podem me ajudar? Estou fazendo um projeto "treino", muito similar ao do curso, e está me apontando o erro abaixo, que não deixa gravar na tabela, como "idCliente" é um identity.

Podem me ajudar ? "The entity type 'Cliente' requires a primary key to be defined."

Segue o codigo.:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LocadoraProj
{
    class Program
    {
        static void Main(string[] args)
        {
            GravarUsandoEntity();
        }

        private static void GravarUsandoEntity()
        {

            Cliente c = new Cliente();


            c.nome = "Diogo Paes";
            c.cpf = "12312312311";
            c.dataNasc = new DateTime(1987,03,17);
            c.endereco = "Joao da silva";
            c.telefone = "44445555";
            c.telefone2 = "955554444";


            using (var contexto = new LocadoraContext())
            {

                contexto.Clientes.Add(c);
                contexto.SaveChanges();

                Console.Write("Por favor aperte qualquer tecla para cotinuar");
                Console.ReadKey();
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace LocadoraProj
{
    internal class ClienteDAO : IDisposable
    {

        private SqlConnection conexao;

        public ClienteDAO()
        {
            //this.conexao = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=LojaDB;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;");
            this.conexao = new SqlConnection("Data Source = (localdb)\\MSSQLLocalDB; Initial Catalog = LocadoraDB; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = True; ApplicationIntent = ReadWrite; MultiSubnetFailover = False;");
            this.conexao.Open();
        }

        public void Dispose()
        {
            this.conexao.Close();
        }

        internal void Adicionar(Cliente c)
        {
            try
            {
                var insertCmd = conexao.CreateCommand();
                insertCmd.CommandText = "INSERT INTO Clientes (nome, cpf, dataNasc, endereco, telefone, telefone2) VALUES (@nome, @cpf, @dataNasc, @endereco, @telefone, @telefone2)";


                var paramNome = new SqlParameter("nome", c.nome);
                insertCmd.Parameters.Add(paramNome);

                var paramcpf = new SqlParameter("cpf", c.cpf);
                insertCmd.Parameters.Add(paramcpf);

                var paramdataNasc = new SqlParameter("dataNasc", c.dataNasc);
                insertCmd.Parameters.Add(paramdataNasc);

                var paramendereco = new SqlParameter("endereco", c.endereco);
                insertCmd.Parameters.Add(paramendereco);

                var paramtelefone = new SqlParameter("telefone", c.telefone);
                insertCmd.Parameters.Add(paramtelefone);

                var paramtelefone2 = new SqlParameter("telefone2", c.telefone2);
                insertCmd.Parameters.Add(paramtelefone2);


                insertCmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw new SystemException(e.Message, e);
            }
        }

        internal IList<Cliente> Clientes()
        {
            var lista = new List<Cliente>();

            var selectCmd = conexao.CreateCommand();
            selectCmd.CommandText = "SELECT * FROM Clientes";

            var resultado = selectCmd.ExecuteReader();
            while (resultado.Read())
            {
                Cliente c = new Cliente();
                c.idCliente = Convert.ToInt32(resultado["idCliente"]);
                c.nome = Convert.ToString(resultado["nome"]);
                c.cpf = Convert.ToString(resultado["cpf"]);
                c.dataNasc = Convert.ToDateTime(resultado["dataNasc"]);
                c.endereco = Convert.ToString(resultado["endereco"]);
                c.telefone = Convert.ToString(resultado["telefone"]);
                c.telefone2 = Convert.ToString(resultado["telefone2"]);

                lista.Add(c);
            }
            resultado.Close();

            return lista;
        }
    }
}
2 respostas
solução!

olá, Pra conseguir gravar os dados na tabelas, foi necessário colocar, "[Key]" na classe cliente conforme abaixo:

using System;
using System.ComponentModel.DataAnnotations;

namespace LocadoraProj
{
    public class Cliente
    {
        [Key]
        public int idCliente { get; internal set; }
        public string nome { get; internal set; }
        public string cpf { get; internal set; }
        public DateTime dataNasc { get; internal set; }
        public string endereco { get; internal set; }
        public string telefone { get; internal set; }
        public string telefone2 { get; internal set; }
    }
}

Pode me explicar por que? Pois no exercicio do curso não tem a necessidade do "[Key]"

Olá, Diogo

Realmente, precisamos anotar a propriedade que serve de chave primária com o atributo Key.

Se você não quiser utilizar esse atributo, também é possível usar uma propriedade Id, que o Entity Framework irá tratar automaticamente como chave primária:

public int Id { get; protected set; }

Obrigado pela participação!