SALVANDO CLASSE COMPLEXA. ENTITY CORE

DEXIE 28/06/2017 16:22:46
#474845
Olá,

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);

KERPLUNK 28/06/2017 21:16:06
#474861
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.
DEXIE 29/06/2017 08:55:15
#474868
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.
DEXIE 29/06/2017 09:58:24
#474869
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[Ô]
}
}
KERPLUNK 29/06/2017 11:38:11
#474874
Ah! Use o método AddOrUpdate que fica no método Seed do migration
DEXIE 29/06/2017 12:53:26
#474878
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?
KERPLUNK 29/06/2017 15:21:26
#474882
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