gpt4 book ai didi

c# - Entity Framework - Include() 加载所有子属性,甚至是虚拟属性

转载 作者:行者123 更新时间:2023-11-30 16:08:40 26 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework - Code First 构建模型,其中我使用具有多对多关系的“Exam”类和“Subject”类。
一个“考试”包含一个“科目”(Subjects)的列表。
一个“Subject”包含一个“Exam”(考试)列表。

“考试”和“科目”都是虚拟属性(property)。

当我使用 context.Exams.Include("Subjects").ToList(); 时,我得到了所有考试以及与每门考试相关的所有科目,这没问题。问题是我还得到了与科目相关的所有考试。

结果:

  1. 考试 1
    • 主题 1
      • 考试 3
      • 考试 4
    • 主题 2
      • 考试 3
  2. 考试 2...


在这种特殊情况下,我不需要与科目相关的考试。我只需要以下数据:

  1. 考试 1
    • 主题 1
    • 主题 2
  2. 考试 2...


Is there a way to include "Subjects" but without the "Exams" property ?


谢谢。

函数

public List<Exam> GetAllExams()
{
using (var context = new PedagogieContext())
{
return context.Exams.Include("Subjects").ToList();
}
}

public class Exam
{
public int Id { get; set; }
public string ExamLabel { get; set; }
public virtual List<Subject> Subjects { get; set; }
}

public class Subject
{
public int Id { get; set; }
public string SubjectLabel { get; set; }
public virtual List<Exam> Exams { get; set; }
}

映射

class SubjectMap : EntityTypeConfiguration<Subject>
{
public SubjectMap()
{
this.HasKey(e => e.Id);
this.Property(e => e.Id).HasColumnName("KeyDiscipline");
this.Property(e => e.SubjectLabel).HasColumnName("DisciplineLib");
this.ToTable("vpDisciplines");
}
}

class ExamMap : EntityTypeConfiguration<Exam>
{
public ExamMap()
{
this.HasKey(e => e.Id);
this.Property(e => e.Id).HasColumnName("KeyExamen");
this.Property(e => e.ExamenLabel).HasColumnName("ExamenLib");
this.ToTable("vExamens");

this.HasMany(e => e.Subjects)
.WithMany(d => d.Exams)
.Map(m =>
{
m.ToTable("vrExamensDisciplines");
m.MapLeftKey("KeyExamen");
m.MapRightKey("KeyDiscipline");
});

}
}

上下文

public class PedagogieContext : DbContext
{
public PedagogieContext()
: base(ConnectionStringManager.GetConnectionString())
{
this.Configuration.LazyLoadingEnabled = false;
}

public DbSet<Exam> Exams { get; set; }
public DbSet<Subject> Subjects { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ExamMap());
modelBuilder.Configurations.Add(new SubjectMap());
}
}

最佳答案

“问题”是每当您从数据库中获取数据时(以及在更多情况下), Entity Framework 都会执行关系修复。这是 EF 自动填充其缓存中实体的导航属性(如 Subject.Exams)的过程。

您正在获取考试和科目,EF 会分别填充它们的科目 考试。没有办法阻止 EF 这样做(有些人可能认为设置 Configuration.AutoDetectChangesEnabled = false 会这样做,但不是)。

请注意,如果您担心的话,您从数据库中获得的考试数量不会多于从查询中获得的考试数量。只是 EF 也创建了关联。在调试 View 中,您可以无休止地扩展集合,而无需访问数据库。

解决方案是不显示 Subject.Exams。如果这是为了序列化,你必须阻止循环引用。一些序列化程序(如 Json.Net)具有执行此操作的设置。

关于c# - Entity Framework - Include() 加载所有子属性,甚至是虚拟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28873797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com