C#-实体框架-Include()加载所有儿童属性,甚至虚拟属性
作者:互联网
我正在尝试使用Entity Framework-Code First构建模型,在该模型中,我使用具有多对多关系的“考试”类和“主题”类.
“考试”包含“主题”(主题)的列表.
“主题”包含“考试”(考试)的列表.
“考试”和“主题”都是虚拟属性.
当我使用context.Exams.Include(“ Subjects”).ToList();时,我会获得所有考试以及与每个考试相关的所有科目,这是可以的.问题是我还参加了与这些科目有关的所有考试.
结果:
>考试1
>主题1
>考试3
>考试4
>主题2
>考试3
>考试2
…
在这种情况下,我不需要与主题相关的考试.我只需要以下数据:
>考试1
>主题1
>主题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还创建了关联.在调试视图中,您可以不断扩展集合,而无需访问数据库.
解决方案是不显示Subject.Exams.如果这是为了序列化,则必须阻止循环引用.一些序列化程序(如Json.Net)具有进行此操作的设置.
标签:entity-framework-6,code-first,c 来源: https://codeday.me/bug/20191120/2045570.html