ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-实体框架-Include()加载所有儿童属性,甚至虚拟属性

2019-11-20 17:06:29  阅读:200  来源: 互联网

标签:entity-framework-6 code-first c


我正在尝试使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有