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, changeestado1.Pais = pais1;
forestado1.PaisHandle = pais1.Handle;
. Don’t forget to do this with other states and cities.– Randrade
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
– Edenilson Bila
And what
EntityValidationErrors
says?– Thiago Lunardi
And make just one
SaveChanges()
, EF can manage by itself who should be saved in the bank before, as it follows its mapping.– Thiago Lunardi
@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 ?
– Nicola Bogar
@Nicolabogar add the solution as answer then, so others who may go through the same problem see the solution. :)
– Thiago Lunardi