Working with Seed + FK Method

Asked

Viewed 371 times

3

I’m finding it difficult to work with the method Seed, Because I register the state, and right away I wanted to register the cities, and then I can’t reference the state in the city, what could I do? I believe you have a solution.

Seed Method

namespace Projeto.Migrations
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using Projeto.Models;

    internal sealed class Configuration : DbMigrationsConfiguration<Projeto.Models.Context>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(Projeto.Models.Context context)
        {
            IList<Estado> estados = new List<Estado>();
            estados.Add(new Estado() { Nome = "Acre", Sigla = "AC" });
            estados.Add(new Estado() { Nome = "Alagoas", Sigla = "AL" });
            estados.Add(new Estado() { Nome = "Amapá", Sigla = "AP" });
            estados.Add(new Estado() { Nome = "Amazonas", Sigla = "AM" });
            estados.Add(new Estado() { Nome = "Bahia", Sigla = "BA" });
            estados.Add(new Estado() { Nome = "Ceará", Sigla = "CE" });
            estados.Add(new Estado() { Nome = "Distrito Federal", Sigla = "DF" });
            estados.Add(new Estado() { Nome = "Espírito Santo", Sigla = "ES" });
            estados.Add(new Estado() { Nome = "Goiás", Sigla = "GO" });
            estados.Add(new Estado() { Nome = "Maranhão", Sigla = "MA" });
            estados.Add(new Estado() { Nome = "Mato Grosso", Sigla = "MT" });
            estados.Add(new Estado() { Nome = "Mato Grosso do Sul", Sigla = "MS" });
            estados.Add(new Estado() { Nome = "Minas Gerais", Sigla = "MG" });
            estados.Add(new Estado() { Nome = "Pará", Sigla = "PA" });
            estados.Add(new Estado() { Nome = "Paraíba", Sigla = "PB" });
            estados.Add(new Estado() { Nome = "Paraná", Sigla = "PR" });
            estados.Add(new Estado() { Nome = "Pernambuco", Sigla = "PE" });
            estados.Add(new Estado() { Nome = "Piauí", Sigla = "PI" });
            estados.Add(new Estado() { Nome = "Rio de Janeiro", Sigla = "RJ" });
            estados.Add(new Estado() { Nome = "Rio Grande do Norte", Sigla = "RN" });
            estados.Add(new Estado() { Nome = "Rio Grande do Sul", Sigla = "RS" });
            estados.Add(new Estado() { Nome = "Rondônia", Sigla = "Ro" });
            estados.Add(new Estado() { Nome = "Roraima", Sigla = "RR" });
            estados.Add(new Estado() { Nome = "Santa Catarina", Sigla = "SC" });
            estados.Add(new Estado() { Nome = "São Paulo", Sigla = "SP" });
            estados.Add(new Estado() { Nome = "Sergipe", Sigla = "SE" });
            estados.Add(new Estado() { Nome = "Tocantins", Sigla = "TO" });
            foreach (Estado estado in estados)
            {
                context.Estados.AddOrUpdate(x => x.EstadoID, estado);
            }

            IList<Cidade> cidades = new List<Cidade>();
            cidades.Add(new Cidade() { Nome = "Aparecida", Estado = "SP" });
            cidades.Add(new Cidade() { Nome = "Guaratinguetá", Estado = 25 });
            cidades.Add(new Cidade() { Nome = "Roseira", Estado = 25 });
            cidades.Add(new Cidade() { Nome = "Lorena", Estado = "25" });
            cidades.Add(new Cidade() { Nome = "Taubaté", Estado = "São Paulo" });
            cidades.Add(new Cidade() { Nome = "Caçapava", Estado = "25" });
            cidades.Add(new Cidade() { Nome = "Pindamonhangaba Federal", Estado = "25" });
            cidades.Add(new Cidade() { Nome = "Potim", Estado = "25" });
            cidades.Add(new Cidade() { Nome = "São José dos Campos", Estado = "25" });
            cidades.Add(new Cidade() { Nome = "Tremembé", Estado = "25" });
            foreach (Cidade cidade in cidades)
            {
                context.Cidades.AddOrUpdate(x => x.CidadeID, cidade);
            }
        }
    }
}

state class

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Projeto.Models
{
    public class Estado
    {
        [Key]
        public int EstadoID { get; set; }

        [Required(ErrorMessage = "Preencha o nome do estado")]
        [DisplayName("Estado")]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "O Estado deve ter de 3 a 50 caracteres.")]
        public string Nome { get; set; }

        [Required(ErrorMessage = "Preencha a sigla")]
        [DisplayName("Sigla")]
        [StringLength(2, MinimumLength = 2, ErrorMessage = "A sigla deve ter de 2 caracteres.")]
        public string Sigla { get; set; }

        //Relacionamentos
        public virtual ICollection<Cidade> Cidades { get; set; }

    }
}

City Class

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Projeto.Models
{
    public class Cidade
    {
        [Key]
        public int CidadeID { get; set; }

        [Required(ErrorMessage = "Preencha o ")]
        [DisplayName("Nome")]
        [StringLength(50, MinimumLength = 3, ErrorMessage = " deve ter de 3 a 50 caracteres.")]
        public string Nome { get; set; }

        ////Relacionamentos
        [DisplayName("Estado")]
        public int EstadoID { get; set; }
        public virtual Estado Estado { get; set; }

        public virtual ICollection<Local> Locais { get; set; }

    }
}

Error:

Class Syystem.String Represents text as a series of Unicode characters.

Error:
Cannot implicitly Convert type 'string' to 'Project.Models.State'

Obs: I’ve tried giving a Convert Convert.ToInt32(25)

inserir a descrição da imagem aqui

2 answers

3


First save the states:

    protected override void Seed(Projeto.Models.Context context)
    {
        IList<Estado> estados = new List<Estado>();
        estados.Add(new Estado() { Nome = "Acre", Sigla = "AC" });
        estados.Add(new Estado() { Nome = "Alagoas", Sigla = "AL" });
        estados.Add(new Estado() { Nome = "Amapá", Sigla = "AP" });
        estados.Add(new Estado() { Nome = "Amazonas", Sigla = "AM" });
        estados.Add(new Estado() { Nome = "Bahia", Sigla = "BA" });
        estados.Add(new Estado() { Nome = "Ceará", Sigla = "CE" });
        estados.Add(new Estado() { Nome = "Distrito Federal", Sigla = "DF" });
        estados.Add(new Estado() { Nome = "Espírito Santo", Sigla = "ES" });
        estados.Add(new Estado() { Nome = "Goiás", Sigla = "GO" });
        estados.Add(new Estado() { Nome = "Maranhão", Sigla = "MA" });
        estados.Add(new Estado() { Nome = "Mato Grosso", Sigla = "MT" });
        estados.Add(new Estado() { Nome = "Mato Grosso do Sul", Sigla = "MS" });
        estados.Add(new Estado() { Nome = "Minas Gerais", Sigla = "MG" });
        estados.Add(new Estado() { Nome = "Pará", Sigla = "PA" });
        estados.Add(new Estado() { Nome = "Paraíba", Sigla = "PB" });
        estados.Add(new Estado() { Nome = "Paraná", Sigla = "PR" });
        estados.Add(new Estado() { Nome = "Pernambuco", Sigla = "PE" });
        estados.Add(new Estado() { Nome = "Piauí", Sigla = "PI" });
        estados.Add(new Estado() { Nome = "Rio de Janeiro", Sigla = "RJ" });
        estados.Add(new Estado() { Nome = "Rio Grande do Norte", Sigla = "RN" });
        estados.Add(new Estado() { Nome = "Rio Grande do Sul", Sigla = "RS" });
        estados.Add(new Estado() { Nome = "Rondônia", Sigla = "Ro" });
        estados.Add(new Estado() { Nome = "Roraima", Sigla = "RR" });
        estados.Add(new Estado() { Nome = "Santa Catarina", Sigla = "SC" });
        estados.Add(new Estado() { Nome = "São Paulo", Sigla = "SP" });
        estados.Add(new Estado() { Nome = "Sergipe", Sigla = "SE" });
        estados.Add(new Estado() { Nome = "Tocantins", Sigla = "TO" });
        foreach (Estado estado in estados)
        {
            context.Estados.AddOrUpdate(x => x.EstadoID, estado);
        }

        context.SaveChanges();

Then select the state and use it to assign the foreign key.

        var saoPaulo = context.Estados.FirstOrDefault(e => e.Sigla == "SP");

        IList<Cidade> cidades = new List<Cidade>();
        cidades.Add(new Cidade() { Nome = "Aparecida", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Guaratinguetá", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Roseira", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Lorena", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Taubaté", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Caçapava", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Pindamonhangaba Federal", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Potim", EstadoId = saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "São José dos Campos", saoPaulo.EstadoId });
        cidades.Add(new Cidade() { Nome = "Tremembé", EstadoId = saoPaulo.EstadoId });
        foreach (Cidade cidade in cidades)
        {
            context.Cidades.AddOrUpdate(x => x.CidadeID, cidade);
        }

        context.SaveChanges();
  • 1

    Thanks @Gypsy, I had done otherwise, but I tested with yours too and it worked, it was much better than I had done! Thanks

1

Well, I figured it out. I did the following:

I removed the state of São Paulo from the list of states

and in the city I instituted a new state and assigns the specifications, with this saved the state São Paulo in the database:

IList<Cidade> cidades = new List<Cidade>();
    Estado SaoPaulo = new Estado();

    SaoPaulo.EstadoID = 27;
    SaoPaulo.Nome = "São Paulo";
    SaoPaulo.Sigla = "SP";

    cidades.Add(new Cidade() { Nome = "Aparecida", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Guaratinguetá", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Roseira", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Lorena", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Taubaté", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Caçapava", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Pindamonhangaba Federal", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Potim", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "São José dos Campos", Estado = SaoPaulo });
    cidades.Add(new Cidade() { Nome = "Tremembé", Estado = SaoPaulo });
    foreach (Cidade cidade in cidades)
    {
        context.Cidades.AddOrUpdate(x => x.CidadeID, cidade);
    }
  • This is not a good solution. It only works because you are block inserting, and the Entity Framework smartly inserts the state for you if it doesn’t exist. This code elsewhere can generate the problem of the highlighted context.

  • 1

    Got it. I did it the way you told me above. Thank you

Browser other questions tagged

You are not signed in. Login or sign up in order to post.