none
Entity Context.SaveChanges() está zerando Id RRS feed

  • Pergunta

  • Saudações.

    Estou utilizando as seguintes rotinas:

    Controle os identificadores assim:

            public int Identity<E>() where E : new()
            {
                E entity = new E();

                string tabela = "";
                int id = 0;
                bool findId = false;

                foreach (var a in entity.GetType().GetCustomAttributes(true))
                {
                    if (a.GetType().Name == "TableAttribute")
                    {
                        tabela = ((TableAttribute)a).Name;
                        break;
                    }
                }

                foreach (var p in entity.GetType().GetProperties())
                {
                    var attribs = p.GetCustomAttributes(true);

                    foreach (var a in attribs)
                    {
                        if (a.GetType().Name == "KeyAttribute")
                        {
                            findId = true;

                            var current = Context.Identificadores.Where(x => x.TableName == tabela && x.ColumnName == p.Name).FirstOrDefault();

                            IdentificadorModel identificador = new IdentificadorModel()
                            {
                                ColumnName = p.Name,
                                TableName = tabela,
                                Increment = 1,
                                LastId = current == null ? 0 : current.LastId + 1
                            };

                            if (current != null)
                                Context.Entry(current).CurrentValues.SetValues(identificador);
                            else
                                Context.Entry(identificador).State = System.Data.EntityState.Added;

                            Save();

                            id = identificador.LastId;
                        }
                    }

                    if (findId)
                        break;
                }

                return id;
            }

    Atribuio assim:

     model.MenuId = MenuFlow.Instance.Identity<MenuModel>();
     Context.Menus.Add(model);
    Context.Entry(entity).State = System.Data.EntityState.Added;
    Context.SaveChanges()

    Antes de chegar no SaveChanges o id esta preenchido, depois disso, dentro dele o id é zerado e vai pro banco 0.

    O que seria?


    Desenvolva!!!

    quarta-feira, 7 de agosto de 2013 16:54

Todas as Respostas

  • Você está dizendo que o return id vem alguma coisa, mas quando você carrega o método identity, passando o tipo MenuModel ele é zerado, certo? Esse MenuModel é uma classe? Não existe em alguma parte por onde é passado antes do SaveChanges(), será que não existe nenhum new? Tipo, zerando tudo e instanciando novamente de forma a atigir o retorno de seu método? O MenuModel, será que ele não está bagunçando o seu coreto? Cara, terá que debugar linha a linha e entrar em cada método chamado e ver se há ou não um new em algum lugar.
    quarta-feira, 7 de agosto de 2013 17:42
  • Opa. Não. Ele é zerado dentro do Context.SaveChanges()

    Desenvolva!!!

    quarta-feira, 7 de agosto de 2013 17:49
  • Descobri o problema:

    Faltou isso   [DatabaseGenerated(DatabaseGeneratedOption.None)] na model.

    Obrigado


    Desenvolva!!!

    quarta-feira, 7 de agosto de 2013 17:56
  • Marque essa como resposta para encerrar o tópico. É isso aí, vc pergunta e vc responde. Isso mesmo, perguntar, mas correr a trás e postar a resposta, isso é legal. Vlw cara.
    quarta-feira, 7 de agosto de 2013 18:07
  • Só mais essa, essa sua foto ficou a cara do Goleiro Bruno. Se tivesse em BH, os caras já tinham te parado, mandado deitar no chão, algemado e já estavam passando o rádio: "O cara fugiu, mas nós já enquadramos o meliante". É para descontrair, não fique bravo!!!
    quarta-feira, 7 de agosto de 2013 18:12