none
HasData() lanza Excepción con entidad relacionada RRS feed

  • Pregunta

  • Hola,

    Tengo 2 entidades relacionadas:

    public class TypeDocumentIdenty
    {
    	public int TypeDocumentIdentyId { get; set; }
    	public string LongDescription { get; set; }
    	public string ShortDescription { get; set; }
    	public bool Deleted { get; set; }
    
    	public ICollection<Employee> Employees { get; set; }
    }
    public class Employee
    {
    	public int EmployeeId { get; set; }
    	public string Names { get; set; }
    	public string PaternalSurname { get; set; }
    	public string MaternalSurname { get; set; }
    	public int TypeDocumentIdentyId { get; set; }
    	public string NumDocumentIdenty { get; set; }
    	public bool Sex { get; set; }
    	public DateTime BirthDay { get; set; }
    	public string Email { get; set; }
    	public string Phone { get; set; }
    	public int NationalityId { get; set; }
    	public int CompanyId { get; set; }
    
    	public TypeDocumentIdenty TypeDocumentIdenty { get; set; }
    	public Country Nationality { get; set; }
    	public ICollection<User> Users { get; set; }
    	public Company Company { get; set; }
    }

    la configuración vía Fluent Api tiene la siguiente forma:

    public class EmployeeConfig : IEntityTypeConfiguration<Employee>
    {
    	public void Configure(EntityTypeBuilder<Employee> entity)
    	{
    		entity.ToTable("Employee", Schemas.COMMON);
    
    		entity.HasKey(t => t.EmployeeId);
    
    		entity.Property(e => e.Names)
    			.HasMaxLength(50)
    			.IsRequired();
    
    		entity.Property(e => e.PaternalSurname)
    			.HasMaxLength(50)
    			.IsRequired();
    
    		entity.Property(e => e.MaternalSurname)
    			.HasMaxLength(50);
    
    		entity.HasOne(t => t.TypeDocumentIdenty)
    			.WithMany(t => t.Employees)
    			.HasForeignKey(t => t.TypeDocumentIdentyId)
    			.OnDelete(DeleteBehavior.NoAction);
    
    		entity.Property(t => t.NumDocumentIdenty)
    			.HasMaxLength(12)
    			.IsRequired();
    
    		entity.Property(e => e.Email)
    			.HasMaxLength(100)
    			.IsRequired();
    
    		entity.Property(e => e.Phone)
    			.HasMaxLength(30)
    			.IsRequired();
    
    		entity.HasOne(t => t.Nationality)
    			.WithMany(t => t.Employees)
    			.HasForeignKey(t => t.NationalityId)
    			.OnDelete(DeleteBehavior.NoAction);
    
    		entity.HasOne(t => t.Company)
    			.WithMany(t => t.Employees)
    			.HasForeignKey(t => t.CompanyId)
    			.OnDelete(DeleteBehavior.NoAction);
    	}
    }

    Trato de insertar datos iniciales vía migración, pero la siguiente línea provoca una excepción y no permite crear la migración de inserción:

    modelBuilder.Entity<Employee>().HasData(new List<Employee> {
    	new Employee { EmployeeId = 1, Names = "Juan", PaternalSurname = "Perez", TypeDocumentIdentyId = 1, NumDocumentIdenty = "12345678", Email = "jperez@empresa.com", Phone = "999888777", NationalityId = 177, CompanyId = 1 }
    });

    El error es el siguiente:

    The association between entity types 'TypeDocumentIdenty' and 'Employee' has been severed but the relationship is either marked as 'Required' or is implicitly required because the foreign key is not nullable. If the dependent/child entity should be deleted when a required relationship is severed, then setup the relationship to use cascade deletes.  Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the key values.

    No puedo cambiar DeleteBehavion.NoAction ya que no se debe permitir la eliminación en cascada
    • Editado eduar2083 miércoles, 9 de septiembre de 2020 0:47
    miércoles, 9 de septiembre de 2020 0:42

Todas las respuestas

  • Por el mensaje de error que sale, tiene toda la pinta de ser un error en el Foreign Key, es decir, que el NationalityId o el CompayId o el DocumentIdentoityId tienen valores que no existen en las respectivas tablas. ¿Has comprobado que esos valores existen y están ya grabados?
    miércoles, 9 de septiembre de 2020 7:35
  • Estoy tratando de insertar todo en una sola migración, es decir tanto las tablas principales como sus dependientes, obviamente las tablas principales las he colocado primero y luego a las que tienen la foránea, algo así:

    modelBuilder.Entity<TypeDocumentIdenty>().HasData(new List<TypeDocumentIdenty> {
    	new TypeDocumentIdenty{ TypeDocumentIdentyId = 1, LongDescription = "LIBRETA ELECTORAL O DNI", ShortDescription = "L.E / DNI" },
    	new TypeDocumentIdenty{ TypeDocumentIdentyId = 2, LongDescription = "CARNET DE EXTRANJERIA", ShortDescription = "CARNET EXT." },
    	new TypeDocumentIdenty{ TypeDocumentIdentyId = 3, LongDescription = "PASAPORTE", ShortDescription = "PASAPORTE" }
    });

    Y más abajo:

    modelBuilder.Entity<Employee>().HasData(new List<Employee> {
    	new Employee { EmployeeId = 1, Names = "Juan", PaternalSurname = "Perez", TypeDocumentIdentyId = 1, NumDocumentIdenty = "12345678", Email = "jperez@empresa.com", Phone = "999888777", NationalityId = 177, CompanyId = 1 }
    });

    Esto no me permite, pero lo que me extraña es que si en la configuración de la entidad quito el OnDelete(DeleteBehavior.NoAction) sí me permite crear todo en una sola migración, imagino que será por la cascada, sin embargo, como había mencionado, no se debe permitir la eliminación en cascada. Lo que he hecho es crear migraciones por separado, en una migración para la inserción en las tablas principales y en otra para las dependientes de éstas y ahí si va bien de momento.

    Quizás sea lo más conveniente, me comentan a ver. 

    Muchas gracias.


    • Editado eduar2083 miércoles, 9 de septiembre de 2020 12:58
    miércoles, 9 de septiembre de 2020 12:57
  • Hola, 

    ¿te fue útil la respuesta?

    jueves, 10 de septiembre de 2020 16:17