繁体   English   中英

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

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

我有一个项目正在运行 .net 核心 6,EF 核心 6.0.9,数据库 -> postgresql 14。

我有这些课程

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

关系定义如下:


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

和 LINQ 表达式

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

返回主要实体,但字段 LanguageFrom 和 LanguageTo 为 null - Include() 不执行任何操作。 我究竟做错了什么?

当两种类型之间定义了多个导航属性时, 影子导航属性将不起作用 您应该定义两个字段作为 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; }
}

然后

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