簡體   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