Prevent Seed from duplicating data

Asked

Viewed 49 times

1

I’m using this code in Seed to generate values in my table, so I don’t have to type in the database, when I change something of my code and need to give an update in the database, so it’s not running, because as far as I have intended, the code below, serves to add or update the information, but it is only adding the values, and with this is duplicating.

context.Estados.Addorupdate(x => x.Estadoid, state);

The Seed method is as follows...

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

    protected override void Seed(Tribus.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();
    }

2 answers

1

Fabio, for Addorupdate to work the right way, you need to inform the fields you will use to make the comparison, and your entities need to have these fields declared.:

So you have two options.:

1. Add the property EstadoID in its entities.:

context.Estados.AddOrUpdate(
    x => x.EstadoID, 
    new Estado() { EstadoID = 1, Nome = "Acre", Sigla = "AC" },
    new Estado() { EstadoID = 2, Nome = "Alagoas", Sigla = "AL" },
    new Estado() { EstadoID = 3, Nome = "Amapá", Sigla = "AP" },
    new Estado() { EstadoID = 4, Nome = "Amazonas", Sigla = "AM" },
    new Estado() { EstadoID = 5, Nome = "Bahia", Sigla = "BA" },
    new Estado() { EstadoID = 6, Nome = "Ceará", Sigla = "CE" },
    new Estado() { EstadoID = 7, Nome = "Distrito Federal", Sigla = "DF" },
    new Estado() { EstadoID = 8, Nome = "Espírito Santo", Sigla = "ES" },
    new Estado() { EstadoID = 9, Nome = "Goiás", Sigla = "GO" },
    new Estado() { EstadoID = 10, Nome = "Maranhão", Sigla = "MA" },
    new Estado() { EstadoID = 11, Nome = "Mato Grosso", Sigla = "MT" },
    new Estado() { EstadoID = 12, Nome = "Mato Grosso do Sul", Sigla = "MS" },
    new Estado() { EstadoID = 13, Nome = "Minas Gerais", Sigla = "MG" },
    new Estado() { EstadoID = 14, Nome = "Pará", Sigla = "PA" },
    new Estado() { EstadoID = 15, Nome = "Paraíba", Sigla = "PB" },
    new Estado() { EstadoID = 16, Nome = "Paraná", Sigla = "PR" },
    new Estado() { EstadoID = 17, Nome = "Pernambuco", Sigla = "PE" },
    new Estado() { EstadoID = 18, Nome = "Piauí", Sigla = "PI" },
    new Estado() { EstadoID = 19, Nome = "Rio de Janeiro", Sigla = "RJ" },
    new Estado() { EstadoID = 20, Nome = "Rio Grande do Norte", Sigla = "RN" },
    new Estado() { EstadoID = 21, Nome = "Rio Grande do Sul", Sigla = "RS" },
    new Estado() { EstadoID = 22, Nome = "Rondônia", Sigla = "RO" },
    new Estado() { EstadoID = 23, Nome = "Roraima", Sigla = "RR" },
    new Estado() { EstadoID = 24, Nome = "Santa Catarina", Sigla = "SC" },
    new Estado() { EstadoID = 25, Nome = "São Paulo", Sigla = "SP" },
    new Estado() { EstadoID = 26, Nome = "Sergipe", Sigla = "SE" },
    new Estado() { EstadoID = 27, Nome = "Tocantins", Sigla = "TO" }
);

2. Use the Nome or Sigla as a comparative property

context.Estados.AddOrUpdate(
    x => x.Nome, 
    new Estado() { Nome = "Acre", Sigla = "AC" },
    new Estado() { Nome = "Alagoas", Sigla = "AL" },
    new Estado() { Nome = "Amapá", Sigla = "AP" },
    new Estado() { Nome = "Amazonas", Sigla = "AM" },
    new Estado() { Nome = "Bahia", Sigla = "BA" },
    new Estado() { Nome = "Ceará", Sigla = "CE" },
    new Estado() { Nome = "Distrito Federal", Sigla = "DF" },
    new Estado() { Nome = "Espírito Santo", Sigla = "ES" },
    new Estado() { Nome = "Goiás", Sigla = "GO" },
    new Estado() { Nome = "Maranhão", Sigla = "MA" },
    new Estado() { Nome = "Mato Grosso", Sigla = "MT" },
    new Estado() { Nome = "Mato Grosso do Sul", Sigla = "MS" },
    new Estado() { Nome = "Minas Gerais", Sigla = "MG" },
    new Estado() { Nome = "Pará", Sigla = "PA" },
    new Estado() { Nome = "Paraíba", Sigla = "PB" },
    new Estado() { Nome = "Paraná", Sigla = "PR" },
    new Estado() { Nome = "Pernambuco", Sigla = "PE" },
    new Estado() { Nome = "Piauí", Sigla = "PI" },
    new Estado() { Nome = "Rio de Janeiro", Sigla = "RJ" },
    new Estado() { Nome = "Rio Grande do Norte", Sigla = "RN" },
    new Estado() { Nome = "Rio Grande do Sul", Sigla = "RS" },
    new Estado() { Nome = "Rondônia", Sigla = "RO" },
    new Estado() { Nome = "Roraima", Sigla = "RR" },
    new Estado() { Nome = "Santa Catarina", Sigla = "SC" },
    new Estado() { Nome = "São Paulo", Sigla = "SP" },
    new Estado() { Nome = "Sergipe", Sigla = "SE" },
    new Estado() { Nome = "Tocantins", Sigla = "TO" }
)
  • Thanks for the reply @Tobymosque. not yet tested pq today will be a busy day for me, but tomorrow I already see if everything is fine. Thanks anyway

  • 1

    Thanks for the help, the process I was doing was right, but the verification was being done by the ID, and with that the other fields were duplicating. With your answer I managed to understand how Seed works, and then I switched context.Estados.Addorupdate(x => x.Estadoid, state); for context.Estados.Addorupdate(x => x.Acronym, state); and it worked. I tested using your method also worked, but as I had done with other attributes, I changed to my standard. Thank you

  • I understand, ended up opting for suggestion 2

0


With the help of @Tobymosque I was able to understand the workings of what I was doing, which was also right, but the data checker, was by ID and not by name. then I did the following:

protected override void Seed(Tribus.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.Sigla, estado);
      }
      context.SaveChanges();
}

In case I just changed from

foreach (Estado estado in estados)
{
     context.Estados.AddOrUpdate(x => x.EstadoID, estado);
}

for

foreach (Estado estado in estados)
{
     context.Estados.AddOrUpdate(x => x.Sigla, estado);
}

changing the x.Estadoid to x.Acronym because what checks at the bank is this part.

Browser other questions tagged

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