1

I have a project that is running with .net core 6, EF Core 6.0.9, DB -> postgresql 14.

I have these classes

    public class Language
    {
        [Key]
        public long Id { get; set; }
        public string PublicId { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Course> CoursesFrom { get; set; }
        public virtual ICollection<Course> CoursesTo { get; set; }
    }

    public class Course
    {
        [Key]
        public long Id { get; set; }
        public string PublicId { get; set; }
        public string Name { get; set; }

        public virtual Language LanguageFrom { get; set; }
        public virtual Language LanguageTo { get; set; }
    }

The relation is defined as follows:


    public class LanguageConfiguration : IEntityTypeConfiguration<Language>
    {
        public void Configure(EntityTypeBuilder<Language> builder)
        {
            ...
            builder.HasMany(l => l.CoursesFrom)
                   .WithOne(c => c.LanguageFrom);

            builder.HasMany(l => l.CoursesTo)
                   .WithOne(c => c.LanguageTo);
        }
    }
    public class CourseConfiguration : IEntityTypeConfiguration<Course>
    {
        public void Configure(EntityTypeBuilder<Course> builder)
        {
            ...
            builder.HasOne(l => l.LanguageFrom)
                   .WithMany(c => c.CoursesFrom)
                   .OnDelete(DeleteBehavior.SetNull);

            builder.HasOne(l => l.LanguageTo)
                   .WithMany(c => c.CoursesTo)
                   .OnDelete(DeleteBehavior.SetNull);
        }
    }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.ApplyConfiguration(new LanguageConfiguration());
    modelBuilder.ApplyConfiguration(new CourseConfiguration());
}

And LINQ expression

var query = Context.Course
                .Include(l => l.LanguageFrom)
                .Include(l => l.LanguageTo)
                .ToList();

Main entity is returned but fields LanguageFrom and LanguageTo are null - the Include() does nothing. What am I doing wrong?

Mr0fka
  • 11
  • 1
  • Have you checked if the data is present in the database? Have you checked the generated SQL? – Guru Stron Dec 12 '22 at 09:41
  • Database is populated with data, tbh I haven't checked the SQL but I managed to solve this problem by adding AutoInclude in the CourseConfiguration to LanguageFrom and LanguageTo properties :) Thx everyone for help :) – Mr0fka Dec 12 '22 at 20:30

1 Answers1

0

When there are multiple navigation properties defined between two types shadow navigation properties do not work. You should define two fields to serve as foreign key in the Course entity:

public class Course
{
    [Key]
    public long Id { get; set; }
    public string PublicId { get; set; }
    public string Name { get; set; }
    public long LanguageFromId { get; set; }
    public long LanguageToId { get; set; }

    public virtual Language LanguageFrom { get; set; }
    public virtual Language LanguageTo { get; set; }
}

Then

public class CourseConfiguration : IEntityTypeConfiguration<Course>
{
    public void Configure(EntityTypeBuilder<Course> builder)
    {
        ...
        builder.HasOne(l => l.LanguageFrom)
               .WithMany(c => c.CoursesFrom)
               .HasForeignKey("LanguageFromId")
               .OnDelete(DeleteBehavior.SetNull);

        builder.HasOne(l => l.LanguageTo)
               .WithMany(c => c.CoursesTo)
               .HasForeignKey("LanguageToId")
               .OnDelete(DeleteBehavior.SetNull);
    }
}
MD Zand
  • 2,366
  • 3
  • 14
  • 25