none
EF - Como setar uma PK com um valor não auto-incremento RRS feed

  • Pergunta

  • Pessoal, fiquei uma tarde inteira tentando solucionar mas não consegui. O google não ajudou muito...

    Preciso setar um campo que é uma chave primária tipo inteiro com um valor, porém este valor eu desejo que seja setado manualmente, sem o auto-incremento.

    Por exemplo:

    Perfil perfil = new Perfil() { Id = 20 };
    db.Perfil.AddObject(perfil);
    db.SaveChanges(); <- Erro nesta linha

    Estou usando o MySql e o erro que me é retornado é o seguinte:

     

    Field 'Id' doesn't have a default value

    Se eu especifico um valor Default no banco de dados o registro fica com este valor, e não o valor da aplicação.

    Já tentei setar na classe Perfil o campo Id com os três tipos de DataAnnotations e nada:

    // Já tentei setar com none, identity e computed
    System.ComponentModel.DataAnnotations.DatabaseGenerated()

    Por favor me ajudem, desde já agradeço.

    segunda-feira, 22 de agosto de 2011 22:26

Respostas

  • Bom turma, acho que o template T4 que eu estava usando não estava muito legal.

    Instalei o C# DbContext Generator e agora está funcionando blz.

    Obrigado pela ajuda.

    Um abraço!

    • Marcado como Resposta Junio Albino terça-feira, 23 de agosto de 2011 18:02
    terça-feira, 23 de agosto de 2011 18:01

Todas as Respostas

  • Junior, você está usando CodeFirst ou um Modelo de mapeamento EDMX ?  se for um modelo certifique-se que nas propriedades do campo que você não quer que seja  auto-incremento. Se o modelo foi criado apartir de um mapeamento de um banco de dados já existente, ai você terá de tirar o identity da coluna em questão
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Jéfte Santos sexta-feira, 20 de setembro de 2013 16:08
    terça-feira, 23 de agosto de 2011 11:30
  • Olá Junio.Si,

    Talvez esse tipo de comportamento o EF não de suporte, pois ao criar o mapeamento objeto relacional, algumas restrições foram criadas, entre elas a necessidade de que esse seu campo seja AutoIncremental.

     

    Se fosse vc, para este caso, criaria um script, que:

    - Desabilitasse o autoincremento do campo

    - Fizesse a inclusão necessaria

    - Voltasse o autoincremento para o campo

     

    E rodaria esse script utilizando as classes nativas do framework, por exemplo System.Data.OleDb.

     

    Acredito que é o melhor caminho, pois o EF não da suporte a essa sua necessidade.

     

    []s!

     


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 23 de agosto de 2011 12:23
    Moderador
  • Junior, você está usando CodeFirst ou um Modelo de mapeamento EDMX ?  se for um modelo certifique-se que nas propriedades do campo que você não quer que seja  auto-incremento. Se o modelo foi criado apartir de um mapeamento de um banco de dados já existente, ai você terá de tirar o identity da coluna em questão
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)


    Fiz com o Modelo de mapeamento, depois usei o template pra gerar as classes POCO.

    Daí especifico que quero usar a classe sem identity.

    Mas no banco quando tiro o auto-incremento da coluna não funciona nada, aí que dá o erro.

    terça-feira, 23 de agosto de 2011 15:28
  • Olá Junio.Si,

    Talvez esse tipo de comportamento o EF não de suporte, pois ao criar o mapeamento objeto relacional, algumas restrições foram criadas, entre elas a necessidade de que esse seu campo seja AutoIncremental.

     

    Se fosse vc, para este caso, criaria um script, que:

    - Desabilitasse o autoincremento do campo

    - Fizesse a inclusão necessaria

    - Voltasse o autoincremento para o campo

     

    E rodaria esse script utilizando as classes nativas do framework, por exemplo System.Data.OleDb.

     

    Acredito que é o melhor caminho, pois o EF não da suporte a essa sua necessidade.

     

    []s!

     


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique


    Ok, acho que vou ter que fazer uma gambiarrazinha pra dar certo. Mas é estranho porque deveria funcionar, pois no próprio EF tem a propriedade

    System.ComponentModel.DataAnnotations.DatabaseGenerated

    que pode ser setada como Identity, ou None, mostrando para o framework que o campo não é identidade

    terça-feira, 23 de agosto de 2011 15:32
  • que tipo de erros existem quando você tira o auto incremento do banco ? você ja tirou o auto-incremento e fez essa mudança no modelo para ver se nao funciona ?
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    terça-feira, 23 de agosto de 2011 15:34
  • que tipo de erros existem quando você tira o auto incremento do banco ? você ja tirou o auto-incremento e fez essa mudança no modelo para ver se nao funciona ?
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)

    Quando tiro o auto incremento do banco é retornado este erro:

    Field 'Id' doesn't have a default value

    Daí no modelo mesmo mudando a propriedade identity do Id para None não resolve nada. Parece que o .Net manda o campo vazio para o banco, daí o banco não aceita o valor nulo e pede um valor default.

    terça-feira, 23 de agosto de 2011 16:49
  • OPS,

    acabo de descobrir que o problema está acontecendo com qualquer campo que eu acrescento.

    Criei um campo Código no modelo e no banco que não é PK, e quando mando setar algum valor retorna o mesmo erro...

    terça-feira, 23 de agosto de 2011 17:09
  • Bom turma, acho que o template T4 que eu estava usando não estava muito legal.

    Instalei o C# DbContext Generator e agora está funcionando blz.

    Obrigado pela ajuda.

    Um abraço!

    • Marcado como Resposta Junio Albino terça-feira, 23 de agosto de 2011 18:02
    terça-feira, 23 de agosto de 2011 18:01