I\'m a very strange behavior with EF code first approach and associations. I have two entities:
public class GlobalKpiSectionn
{
public GlobalKpiSection(
To force cascade deletes, you have to use the fluent configurations. You can then remove the [Required]
attribute from the KpiSection property.
Something like this:
public class GlobalKpiSectionn
{
public GlobalKpiSection()
{
this.Regions = new HashSet<Region>();
}
public virtual ICollection<Region> Regions { get; protected set; }
}
public class Region
{
public int RegionId { get; set; }
public bool IsMain { get; set; }
public int GlobalKpiSectionId { get; set; }
public virtual GlobalKpiSection KpiSection { get; set; }
}
public class RegionConfig : EntityTypeConfiguration<Region>
{
HasRequired(x => x.KpiSection)
.WithMany(x => x.Regions)
.HasForeignKey(x => x.GlobalKpiSectionId)
.WillCascadeOnDelete(true);
}
public class YourContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new RegionConfig());
}
}
EF disabled lazy loading when it validates the entities. It does this to avoid unnecessary round trips to database due to the validations placed on navigational properties.
Model the scalar property in your entity and place the validation attribute there.
public class Region
{
public int RegionId { get; set; }
public bool IsMain { get; set; }
[Required]
public int? KpiSectionId { get; set; }
public virtual GlobalKpiSection KpiSection { get; set; }
}
That is why you should not use data annotations. Data annotations are wrong feature because they do both mapping and validation (violation of single responsibility) - as you see it is not always what you want. So your current options are:
context.Configuration.ValidateOnSaveEnabled = false
KpiSectionId
foreign key property in your Region
entity (you will not need Required
attribute on your navigation property).Example:
modelBuilder.Entity<GlobalKpiSection>()
.WithMany(s => s.Regions)
.HasRequired(r => r.KpiSection);