Usuário com melhor resposta
EF - Como setar uma PK com um valor não auto-incremento

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 linhaEstou 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.
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
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
-
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 -
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.
-
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 propriedadeSystem.ComponentModel.DataAnnotations.DatabaseGenerated
que pode ser setada como Identity, ou None, mostrando para o framework que o campo não é identidade
-
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 :) -
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.
-
-
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