none
Já foi adicionado um item com a mesma chave. RRS feed

  • Pergunta

  • E aí pessoal. blz ??

    Estou tendo um problema ao executar uma ActionResult Ao fazer executar, é exibida uma página de erro com a descrição 

    Server Error in '/' Application.

    Já foi adicionado um item com a mesma chave.

    Segue abaixo a codificação da ActionResult e da View

    //insere ou altera o produto
            public ActionResult InsereProduto(Produto p)
            {
                ProdutoDAL dal = new ProdutoDAL();
                dal.InsereProduto(p);//insere ou altera o produto
                return View("CadastroProduto");//atualiza a página
            }

    //view

    @model MODEL.Produto

    @{
        ViewBag.Title = "CadastroProduto";
    }

    @using (Html.BeginForm("InsereProduto","Produto",FormMethod.Post))
    {
        @Html.ValidationSummary(true)

        <fieldset>
            <legend>CADASTRO DE PRODUTO</legend>
            <br />
            <div class="editor-label">
                <table>
                    <tr>
                        <td>@Html.LabelFor(model => model.ProdCode,"CÓDIGO:")</td>
                        <td>@Html.EditorFor(model => model.ProdCode)</td>
                        <td>@Html.ValidationMessageFor(model => model.ProdCode)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.Descricao,"DESCRIÇÃO:")</td>
                        <td>@Html.TextAreaFor(model => model.Descricao)</td>
                        <td>@Html.ValidationMessageFor(model => model.Descricao)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.CodBarra,"CÓD.BARRA:")</td>
                        <td>@Html.EditorFor(model => model.CodBarra)</td>
                        <td>@Html.ValidationMessageFor(model => model.CodBarra)</td>
                    </tr>
                    <tr>                    
                        <td>@Html.Label("UNIDADE:")</td>
                        <td>@Html.DropDownListFor(model => model.UnidMedId,(IEnumerable<SelectListItem>)ViewBag.Unidade)</td>
                        <td>@Html.ValidationMessageFor(model => model.UnidMedId)</td>
                    </tr>
                     <tr>                    
                        <td>@Html.Label("LINHA DE PRODUTO:")</td>
                        <td>@Html.DropDownListFor(model => model.LinprodId,(IEnumerable<SelectListItem>)ViewBag.ProdLinha)</td>
                        <td>@Html.ValidationMessageFor(model =>  model.LinprodId)</td>
                    </tr>
                    <tr>                    
                        <td>@Html.Label("SITUAÇÃO TRIBUTÁRIA:")
                        <td>@Html.DropDownListFor(model => model.TributarioId,(IEnumerable<SelectListItem>)ViewBag.Tributario)</td>
                        <td>@Html.ValidationMessageFor(model => model.TributarioId)</td>
                    </tr>
                    <tr>                    
                        <td>@Html.Label("CLASSIFICAÇÃO FISCAL:")</td>
                        <td>@Html.DropDownListFor(model => model.ClasfiscId,(IEnumerable<SelectListItem>)ViewBag.Clasfisc)</td>
                        <td>@Html.ValidationMessageFor(model => model.ClasfiscId)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.PrecoCusto,"PREÇO DE CUSTO:")</td>
                        <td>@Html.EditorFor(model => model.PrecoCusto)</td>
                        <td>@Html.ValidationMessageFor(model => model.PrecoCusto)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.PrecoTab,"PREÇO UNITÁRIO:")</td>
                        <td>@Html.EditorFor(model => model.PrecoTab)</td>
                        <td>@Html.ValidationMessageFor(model => model.PrecoTab)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.ProdEstoque.QttEstoqueFisico,"QTT.ESTOQUE:")</td>
                        <td>@Html.EditorFor(model => model.ProdEstoque.QttEstoqueFisico)</td>
                        <td>@Html.ValidationMessageFor(model => model.ProdEstoque.QttEstoqueFisico)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.ProdEstoque.QttMinEstoque,"QTT.ESTOQUE MÍNIMO:")</td>
                        <td>@Html.EditorFor(model => model.ProdEstoque.QttMinEstoque)</td>
                        <td>@Html.ValidationMessageFor(model => model.ProdEstoque.QttMinEstoque)</td>
                    </tr>
                    <tr>
                        <td>@Html.LabelFor(model => model.Status,"STATUS:")</td>
                        <td>@Html.DropDownListFor(model => model.Status,(IEnumerable<SelectListItem>)ViewBag.Status)</td>
                        <td>@Html.ValidationMessageFor(model => model.Status)</td>
                    </tr>
                </table>
            </div>          
            <br />
            <p>            
                <input type="submit" value="SALVAR" />&nbsp;
                <input type ="reset" value ="LIMPAR" />
            </p>
        </fieldset>
    }

    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }

    O método que faz o Insert no banco de dados eu já utilizo em outros projetos, e funciona normalmente. Achei que fosse algum problema referente ao banco de dados, mas coloquei um breakPoint para depurar a execução do método, e percebi que nem mesmo está sendo executado. Alguém já viu esse tipo de erro ?

    quarta-feira, 2 de outubro de 2013 14:13

Todas as Respostas

  • cara esse erro é de BD mesmo, tem certeza que o método InsereProduto não esta tentando adicionar um mesmo item ao invés de alterar?
    quarta-feira, 2 de outubro de 2013 16:37
  • 1. Verifique se na tabela a chave primária está setada como Identity corretamente

    2. Insira na assinatura da sua Action:

     public ActionResult InsereProduto([Bind(Exclude='[Nome_da_chave_primária]')]Produto p)

    quarta-feira, 2 de outubro de 2013 16:40
    Moderador
  • E aí Rafael. Blz ?? Então, no método antes de inserir,é feita uma consulta para saber se o produto já consta na tabela. Se não constar insere, caso contrário, faz alteração nos dados de acordo com o código do produto, que é a chave primária. O que estou achando estranho, é que coloquei o breakPoint e o sistema parece estar parando antes da execução.
    quarta-feira, 2 de outubro de 2013 16:51
  • Opa. blz João ??

    A primary key da tabela é o código do produto. A coluna não é de auto incremento(Identity), mesmo pq seu tipo é varchar. De qualquer forma, alterei o código da minha action, acresentando Bind(Exclude, como você sugeriu, mas o erro ainda continua.

    quarta-feira, 2 de outubro de 2013 17:25
  • então ele não esta batendo nem na sua action InsereProduto??
    quarta-feira, 2 de outubro de 2013 17:55
  • Isso mesmo. Um amigo meu também achou que fosse algo referente a tabela no bd. Fez acesso remoto na minha máquina, e viu que não está nem mesmo executando a minha action. Por via das dúvidas, testamos um insert manualmente no BD, com os mesmos valores que estava tentando passar na página, e inseriu normalmente. 

    Cara, seja como for, fico muito agradecido pela atenção, não só a você, mas a todos que estão tentando ajudar.

    quarta-feira, 2 de outubro de 2013 18:02
  • cara queria então só saber como vc esta chamando a sua ActionResult

    porque ela é um GET então vc precisa estar passando os parâmetros para ela já que ela esta esperando um objeto do tipo Produto!

    entao ela é chamada a partir de um Redirect de outra Action os parâmetros estão sendo passado corretamente?

    quarta-feira, 2 de outubro de 2013 18:13
  • Realmente está faltando na sua Action o decorator do HTTP post: [HttpPost].

    Nesse caso o MVC interpreta como duas requisições, uma para o post e outra para o get, e aí ocasiona o erro.

    Coloque do jeito abaixo que irá funcionar:

    [HttpPost] 
    public ActionResult InsereProduto(Produto p)

    quarta-feira, 2 de outubro de 2013 22:31
    Moderador
  • Carlos boa noite, este tipo de problema geralmente é relacionado a banco de dados como o campo chave é do tipo varchar, verifica se o valor que esta chegando na variável em que você faz a condição para verificar se o produto esta cadastrado não esta com espaço antes ou depois do valor.

    coloca ai o fonte do método dal.InsereProduto(p); para analise.

    outra coisa faz tratamento de erro para não exibir esta tela.

    quinta-feira, 3 de outubro de 2013 00:25
  • E aí João. Blz  ??

    Deixei da forma como você sugeriu, mas ainda assim o erro continua.

    quinta-feira, 3 de outubro de 2013 12:20
  • Bom dia Marcos.

    Desde o início achei que fosse relativo ao banco de dados, mas fiz um insert manualmente, com os mesmos valores que estava passando na página, e não houve erro. Além disso, no meu código, tem uma condição para inserir somente se o produto ainda não existir, e caso contrário, altera os valores de acordo com o código. Segue abaixo o método que faz o Insert:

    //insere ou altera produto
            public void InsereProduto(Produto p)
            {
                AbreConexao();
                Cmd.Parameters.AddWithValue("@descricao", p.Descricao);
                Cmd.Parameters.AddWithValue("@codBarra", p.CodBarra);
                Cmd.Parameters.AddWithValue("@linprodId", p.LinprodId);
                Cmd.Parameters.AddWithValue("@unidmedId", p.UnidMedId);
                Cmd.Parameters.AddWithValue("@tributarioId", p.TributarioId);
                Cmd.Parameters.AddWithValue("@clasfiscId", p.ClasfiscId);
                Cmd.Parameters.AddWithValue("@precoCusto", p.PrecoCusto);
                Cmd.Parameters.AddWithValue("@precoTab", p.PrecoTab);
                Cmd.Parameters.AddWithValue("@estoque", p.ProdEstoque.QttEstoqueFisico);
                Cmd.Parameters.AddWithValue("@estoqueMinimo", p.ProdEstoque.QttMinEstoque);
                Cmd.Parameters.AddWithValue("@status", p.Status);
                if (string.IsNullOrEmpty(p.ProdCode))//produto ainda não existe e será inserido
                {
                    Cmd.CommandText = "SELECT ULTIMOPRODCODE FROM CONFIG";
                    Dr = Cmd.ExecuteReader();
                    Dr.Read();
                    Cmd.Parameters.AddWithValue("@prodCode", Global.GetInt(Dr["ULTIMOPRODCODE"].ToString()) + 1);//gera um novo código
                    FechaDataReader();
                    Cmd.CommandText = "INSERT INTO PRODUTO" +
                                      "(PRODCODE,DESCRICAO,COD_BARRA,LINPROD_ID,UNIDMEDID,TRIBUTARIO_ID,CLASFISCID,PRECO_CUSTO,STATUS) " +
                                      "VALUES" +
                                      "(@prodCode,@descricao,@codBarra,@linprodId,@unidmedId,@tributarioId,@clasfiscId,@,precoCusto,@status)";
                }
                else//produto já existe e seus dados serão alterados
                {
                    Cmd.Parameters.AddWithValue("@prodCode", p.ProdCode);
                    Cmd.CommandText = "UPDATE PRODUTO SET " +
                                      "DESCRICAO = @descricao," +
                                      "COD_BARRA = @codBarra," +
                                      "LINPROD_ID = @linprodId," +
                                      "UNIDMEDID = @unidmedId," +
                                      "TRIBUTARIO_ID = @tributarioId," +
                                      "CLASFISCID = @clasfiscId," +
                                      "PRECO_CUSTO = @precoCusto," +
                                      "STATUS = @status " +
                                      "WHERE PRODCODE = @prodCode";
                }
                ExecutaQuery();
                FechaConexao();
            }

    quinta-feira, 3 de outubro de 2013 12:26
  • Pessoal estou com o mesmo problema. O erro ocorre no bind do MVC (formulário html para objeto). Antes de chegar na controller. Será que não tem um jeito de debug antes do MVC fazer o bind.


    akme

    quinta-feira, 14 de novembro de 2013 22:36
  • Verifique se no seu Model tem dois parâmetros com o mesmo nome , os parametros são case insensitive. (é...)

    Não dá pau na compilação e dá pau em execução.

    Exemplo

    se vc colocar isso no seu model :

    [Required(ErrorMessage = "*")]
    [StringLength(200)]
    [Display(Name = "Email")]
    [EmailAddress(ErrorMessage="Endereço de email inválido.")]
    public string contato_email { get; set; }

    [StringLength(200)]
    public string contato_Email { get; set; }

    e no View :
    <div class="editor-field">
                @Html.EditorFor(model => model.contato_email)
                @Html.ValidationMessageFor(model => model.contato_email)
     </div>

    vai apresentar esse erro e chave duplicada, e não tem NADA a ver com base de dados , NADA!

    Abraçao


    L H Crivelli


    quinta-feira, 5 de dezembro de 2013 04:52
  • Verifique se no seu Model tem dois parâmetros com o mesmo nome , os parametros são case insensitive. (é...)

    Não dá pau na compilação e dá pau em execução.

    Exemplo

    se vc colocar isso no seu model :

    [Required(ErrorMessage = "*")]
    [StringLength(200)]
    [Display(Name = "Email")]
    [EmailAddress(ErrorMessage="Endereço de email inválido.")]
    public string contato_email { get; set; }

    [StringLength(200)]
    public string contato_Email { get; set; }

    e no View :
    <div class="editor-field">
                @Html.EditorFor(model => model.contato_email)
                @Html.ValidationMessageFor(model => model.contato_email)
     </div>

    vai apresentar esse erro e chave duplicada, e não tem NADA a ver com base de dados , NADA!

    Abraçao


    L H Crivelli


    Olá,

    Tive esse problema recentemente.

    Retirei os dataannotions da model, mas continua o mesmo problema.

    e Também não é problema no banco.

    :(

    quarta-feira, 21 de dezembro de 2016 16:54
  • Bom dia,

    verifique se sua classe não esta herdando outra classe no qual possui o mesmo nome de atributo.

    tive um problema parecido recentemente.

    domingo, 16 de julho de 2017 11:21
  • Bom dia Carlos.

    Vou passar para você uma solução que tive de um problema bem parecido.

    Estava com uma classe "Post" que estava funcionando perfeitamente, então precisei criar um relacionamento com uma classe "Category", só que a classe "Category" estava com um nome e o controller dessa classe foi criada com um nome diferente "CategoriesController", quando criei o relacionamento, criei o relacionamento com o nome da classe que ficou assim:

    public virtual Category Category { get; set; }

    Isso me criou um problema no SQL Server o relacionamento ficou assim: "FK_dbo.Post_Categories_Category_CategoryId" provavelmente ele não entendeu que era um relacionamento e sim um novo campo de chave primária. A Solução foi simples, alterei o nome do relacionamento para:

    public virtual Category Categories { get; set; }

     Rodei o Migrations e ele consertou o erro automáticamente.

    "FK_dbo.Post_Categories_CategoryId"

    Bom! Espero ter ajudado.

    Até.


    David


    quinta-feira, 22 de março de 2018 13:19