简体   繁体   English

EF Core Include() 在查询后给出 null

[英]EF Core Include() gives null after query

I have a project that is running with .net core 6, EF Core 6.0.9, DB -> postgresql 14.我有一个项目正在运行 .net 核心 6,EF 核心 6.0.9,数据库 -> 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和 LINQ 表达式

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.返回主要实体,但字段 LanguageFrom 和 LanguageTo 为 null - Include() 不执行任何操作。 What am I doing wrong?我究竟做错了什么?

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:您应该定义两个字段作为 Course 实体中的外键:

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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM