SALVANDO CLASSE COMPLEXA. ENTITY CORE
Olá,
Estou codificando uma WEBApi e nela tenho três entidades:
Pais.cs
Estado.cs
Cidade.cs
O problema está na hora que tento adicionar uma nova cidade. O Entity entende que ele deve adicionar o Pais e o Estado novamente, e ai ocorre erro de violação de chave primária nessas tabelas.... Gostaria de saber como resolvo isso.
Método insertAsync
Estou codificando uma WEBApi e nela tenho três entidades:
Pais.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
namespace api.Models.PackgeEndereco
{
public class Pais
{
[Key]
public Int32 id { get; set; }
public String descricao { get; set; }
}
}
Estado.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
namespace api.Models.PackgeEndereco
{
public class Estado
{
[Key]
public Int32 id { get; set; }
public virtual Pais pais { get; set; }
public String descricao { get; set; }
public String sigla { get; set; }
}
}
~Cidade.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
namespace api.Models.PackgeEndereco
{
public class Cidade
{
[Key]
public Int32 id { get; set; }
public virtual Estado estado { get; set; }
public String descricao { get; set; }
}
}
O problema está na hora que tento adicionar uma nova cidade. O Entity entende que ele deve adicionar o Pais e o Estado novamente, e ai ocorre erro de violação de chave primária nessas tabelas.... Gostaria de saber como resolvo isso.
Método insertAsync
context.Cidade.Add(item);
await context.SaveChangesAsync();
return await getById(item.id);
Simples chave estrangeira. [Ô]item[Ô] deve conter os dados necessários, ou você terá o erro que mencionou. Se Cidade depende de estado e estado depende de paÃs, cada cidade deve ser cadastrada com seu estado correspondente e cada estado com seu paÃs correspondente.
Obrigado pelas respostas Kerplunk, mas não estou entendo uma coisa. Se eu quero fazer o code-first eu não deveria estar utilizando o Fluent API? Porque eu já coloquei as annotation de maxlenght, key e agora teria de colocar a de foreing key.
Vi alguns tutoriais na internet que falam para utilizar o método OnModelCreating no DbContext, mas não obtive sucesso na implementação, eu criei o método, mas não entendi quando devo chama-lo para que crie o banco/tabelas.
Problema é que estou vendo as duas formas de implementação e não sei qual é a melhor/correta.
Vi alguns tutoriais na internet que falam para utilizar o método OnModelCreating no DbContext, mas não obtive sucesso na implementação, eu criei o método, mas não entendi quando devo chama-lo para que crie o banco/tabelas.
Problema é que estou vendo as duas formas de implementação e não sei qual é a melhor/correta.
Só para exemplificar melhor Kerplunk, o erro que ocorre ao tentar executar o método POST é [Ô]Cannot insert explicit value for identity column in table [ô]Pais[ô] when IDENTITY_INSERT is set to OFF.[Ô] e o JSON que estou enviando é:
{
[Ô]descricao[Ô]: [Ô]Ribeirão Preto[Ô],
[Ô]estado[Ô]: {
[Ô]id[Ô]: 1,
[Ô]pais[Ô]: {
[Ô]id[Ô]: 1,
[Ô]descricao[Ô]: [Ô]Brasil[Ô]
},
[Ô]descricao[Ô]: [Ô]São Paulo[Ô],
[Ô]sigla[Ô]: [Ô]SP[Ô]
}
}
{
[Ô]descricao[Ô]: [Ô]Ribeirão Preto[Ô],
[Ô]estado[Ô]: {
[Ô]id[Ô]: 1,
[Ô]pais[Ô]: {
[Ô]id[Ô]: 1,
[Ô]descricao[Ô]: [Ô]Brasil[Ô]
},
[Ô]descricao[Ô]: [Ô]São Paulo[Ô],
[Ô]sigla[Ô]: [Ô]SP[Ô]
}
}
Ah! Use o método AddOrUpdate que fica no método Seed do migration
Desculpe, mas não entendi. No momento estou com dois problemas, e acho que estou me enrolando nas perguntas, me desculpe por isso.
1° Se eu vou utilizar o code-first eu devo re-escrever o método OnModelCreating certo? Ai dentro dele eu coloco a definição das minhas entidades no banco. Porque eu fiz isso, mas ele simplesmente não cria a estrutura do banco, no caso esse método seed fica onde ou onde devo escreve-lo?
2º Utilizando o migration eu consegui que ele cria-se o banco e as tabelas, mas ao tentar realizar o insert com o json acima o sistema me retorna violação de chave primária na tabela Pais. Pelo que entendi ele está tentando inserir em todas as tabelas, e não só na cidade. Por que isso ocorre?
1° Se eu vou utilizar o code-first eu devo re-escrever o método OnModelCreating certo? Ai dentro dele eu coloco a definição das minhas entidades no banco. Porque eu fiz isso, mas ele simplesmente não cria a estrutura do banco, no caso esse método seed fica onde ou onde devo escreve-lo?
2º Utilizando o migration eu consegui que ele cria-se o banco e as tabelas, mas ao tentar realizar o insert com o json acima o sistema me retorna violação de chave primária na tabela Pais. Pelo que entendi ele está tentando inserir em todas as tabelas, e não só na cidade. Por que isso ocorre?
O método Seed, fica na classe [Ô]Configuration[Ô], na pasta Migrations. é nele que você deve fazer a inserção dos seus dados [Ô]imutáveis[Ô]. E não não é necessário re-escrever o método [Ô]OnModelCreating[Ô]
Tópico encerrado , respostas não são mais permitidas