Error inserting data with Entrityframework C#

Asked

Viewed 120 times

1

I have a very strange problem, I have 3 tables, being them, Countries, States and Cities, all of them are configured certainly equal, but it is giving error only when it is inserted data in the table Cities.

Classes:

public class Paises : EntityBase
{
    public Paises()
    {
        Estados = new List<Estados>();
    }

    public string Descricao { get; set; }
    public string Sigla { get; set; }
    public ICollection<Estados> Estados { get; set; }
}

public class Estados : EntityBase
{
    public Estados()
    {
        Pais = new Paises();
        Cidades = new List<Cidades>();
    }

    public string Descricao { get; set; }
    public string Sigla { get; set; }
    public int PaisHandle { get; set; }
    public Paises Pais { get; set; }
    public ICollection<Cidades> Cidades { get; set; }
}

public class Cidades : EntityBase
{
    public Cidades()
    {
        Estado = new Estados();
    }

    public string Descricao { get; set; }
    public string Sigla { get; set; }
    public int EstadoHandle { get; set; }
    public Estados Estado { get; set; }       
}

Mapping

public class PaisesMapping : EntityTypeConfiguration<Paises>
{
    public PaisesMapping()
    {
        ToTable("PAISES");

        HasKey(x => x.Handle);

        Property(x => x.Descricao).HasMaxLength(150).IsRequired();
        Property(x => x.Sigla).HasMaxLength(3).IsRequired();

        HasMany(x => x.Estados);
    }
}

public class EstadosMapping : EntityTypeConfiguration<Estados>
{
    public EstadosMapping()
    {
        ToTable("ESTADOS");

        HasKey(x => x.Handle);

        Property(x => x.Descricao)
            .HasMaxLength(150)
            .IsRequired();

        Property(x => x.Sigla)
            .HasMaxLength(2)
            .IsRequired();

        HasRequired(x => x.Pais)
            .WithMany(x => x.Estados)
            .HasForeignKey(x => x.PaisHandle);   
    }
}

public class CidadesMapping : EntityTypeConfiguration<Cidades>
{
    public CidadesMapping ()
    {
        ToTable("CIDADES");

        HasKey(x => x.Handle);

        Property(x => x.Descricao)
            .HasMaxLength(150)
            .IsRequired();

        Property(x => x.Sigla)
            .HasMaxLength(3)
            .IsRequired();

        HasRequired(x => x.Estado)
            .WithMany(x => x.Cidades)
            .HasForeignKey(x => x.EstadoHandle);    
    }           
}

Context class

public partial class AdventureContext : DbContext
{
    static AdventureContext()
    {
        Database.SetInitializer<AdventureContext>(null);                        
    }

    public AdventureContext()
        : base("Name=AdventureContext")
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Paises> Paises { get; set; }
    public DbSet<Estados> Estados { get; set; }
    public DbSet<Cidades> Cidades { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Aqui vamos remover a pluralização padrão do Etity Framework que é em inglês
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        /*Desabilitamos o delete em cascata em relacionamentos 1:N evitando
         ter registros filhos     sem registros pai*/
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

        //Basicamente a mesma configuração, porém em relacionamenos N:N
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        /*Toda propriedade do tipo string na entidade POCO
         seja configurado como VARCHAR no SQL Server*/
        modelBuilder.Properties<string>()
                  .Configure(p => p.HasColumnType("varchar"));

        modelBuilder.Properties()
           .Where(p => p.Name.ToUpper() == "HANDLE")
           .Configure(p => p.IsKey());

        modelBuilder.Configurations.Add(new PaisesMapping());
        modelBuilder.Configurations.Add(new EstadosMapping());
        modelBuilder.Configurations.Add(new CidadesMapping());
    }
}

Inserting data with Entityframework

Error is given in 3° Savechanges(), introducing:

Validation failed for one or more entities. See 'Entityvalidationerrors' Property for more Details.

    private void Form1_Load(object sender, EventArgs e)
    {
        AdventureContext ac = new AdventureContext();

        Paises pais1 = new Paises();
        pais1.Handle = 1;
        pais1.Descricao = "BRASIL";
        pais1.Sigla = "BRA";
        pais1.DataCadastro = DateTime.Now;
        pais1.UsuarioCadastro = "Nicola Bogar";

        Paises pais2 = new Paises();
        pais2.Handle = 2;
        pais2.Descricao = "FRANÇA";
        pais2.Sigla = "FRA";
        pais2.DataCadastro = DateTime.Now;
        pais2.UsuarioCadastro = "Nicola Bogar";

        Estados estado1 = new Estados();
        estado1.Handle = 1;
        estado1.Descricao = "SÃO PAULO";
        estado1.Sigla = "SP";
        estado1.Pais = pais1;
        estado1.DataCadastro = DateTime.Now;
        estado1.UsuarioCadastro = "Nicola Bogar";

        Estados estado2 = new Estados();
        estado2.Handle = 2;
        estado2.Descricao = "RIO DE JANEIRO";
        estado2.Sigla = "RJ";
        estado2.Pais = pais2;
        estado2.DataCadastro = DateTime.Now;
        estado2.UsuarioCadastro = "Nicola Bogar";

        Estados estado3 = new Estados();
        estado3.Handle = 3;
        estado3.Descricao = "SANTA CATARINA";
        estado3.Sigla = "SC";
        estado3.Pais = pais1;
        estado3.DataCadastro = DateTime.Now;
        estado3.UsuarioCadastro = "Nicola Bogar";

        Cidades cidade1 = new Cidades();
        cidade1.Handle = 1;
        cidade1.Descricao = "GUARARAPES";
        cidade1.Sigla = "GUA";
        cidade1.Estado = estado1;
        cidade1.DataCadastro = DateTime.Now;
        cidade1.UsuarioCadastro = "Nicola Bogar";

        Cidades cidade2 = new Cidades();
        cidade2.Handle = 2;
        cidade2.Descricao = "ARAÇATUBA";
        cidade2.Sigla = "ARA";
        cidade2.Estado = estado1;
        cidade2.DataCadastro = DateTime.Now;
        cidade2.UsuarioCadastro = "Nicola Bogar";

        Cidades cidade3 = new Cidades();
        cidade3.Handle = 3;
        cidade3.Descricao = "BLUMENAU";
        cidade3.Sigla = "BLU";
        cidade3.Estado = estado3;
        cidade3.DataCadastro = DateTime.Now;
        cidade3.UsuarioCadastro = "Nicola Bogar";

        try
        {
            ac.Paises.Add(pais1);
            ac.Paises.Add(pais2);
            ac.SaveChanges();

            ac.Estados.Add(estado1);
            ac.Estados.Add(estado2);
            ac.Estados.Add(estado3);
            ac.SaveChanges();

            ac.Cidades.Add(cidade1);
            ac.Cidades.Add(cidade2);
            ac.Cidades.Add(cidade3);
            ac.SaveChanges();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }            
    }
}
  • Try to pass the id relationship rather than navigation property. That is, change estado1.Pais = pais1; for estado1.PaisHandle = pais1.Handle;. Don’t forget to do this with other states and cities.

  • In Exception will have the Entityvalidation look what is saying there and put here, La that shows the error that the BD Returned, But from what I understood is precisely what Nicola said, Inform the Id of the foreign key and not the class

  • And what EntityValidationErrors says?

  • And make just one SaveChanges(), EF can manage by itself who should be saved in the bank before, as it follows its mapping.

  • @Thiagolunardi, Can you find the error, I had put the acronym field of the entity City as 2 characters, then I changed the mapping to 3 characters but had not given the Update-Database, so it exploded the error, there is a question of mine, there are no more specific errors for the RU ?

  • @Nicolabogar add the solution as answer then, so others who may go through the same problem see the solution. :)

Show 1 more comment

1 answer

1

The problem I was having was that I created the Acronym field with 3 characters, then switched to 2 characters and forgot to run Update-Database.

Browser other questions tagged

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