编程语言
首页 > 编程语言> > C#-实体框架-Include()加载所有儿童属性,甚至虚拟属性

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