I have a very strange problem, I have 3 tables, being them, Countries, States and Cities, all of them are certainly configured the same, but it is giving error only when you enter data in the Cities table.
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
The Error is given in the 3rd SaveChanges (), by typing:
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);
}
}
}