2015-03-05 4 views
3

Я пытаюсь построить модель с Entity Framework - Code First, в которой я использую класс «Экзамен» и класс «Тема», у которых есть много - много отношений.
«Экзамен» содержит список «Тема» (темы).
«Тема» содержит список «Экзамен» (Экзамены).Entity framework - Include() загружает все свойства chidren даже виртуальные

Оба «Экзамена» и «Субъекты» являются виртуальными свойствами.

Когда я использую context.Exams.Include("Subjects").ToList();, я получаю все экзамены и все предметы, связанные с каждым экзаменом, что в порядке. Проблема в том, что я также получаю все экзамены по предметам.

Результат:

  1. экзамен 1
    • Тема 1
      • экзамен 3
      • экзамен 4
    • Тема 2
      • экзамен 3
  2. экзамен 2 ...


В данном конкретном случае, я не нужны экзамены, связанные с субъектами. Мне просто нужно следующие данные:

  1. экзамен 1
    • Тема 1
    • Тема 2
  2. экзамен 2 ...


Есть ли способ включить «Субъекты», но без свойства «Экзамены»?


Спасибо.

Функция

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()); 
    } 
} 
+0

Убедитесь, что 'LazyLoading' отключена. –

+0

Вы уверены, что загружены субо-экзамены? Они являются ленивыми объектами, поэтому EF может загружать их позже и абсолютно прозрачно. –

+0

Я попытался отключить LazyLoading, но я все еще получаю суб-экзамены. – MrMelodie

ответ

2

«Проблема» в том, что Entity Framework выполняет отношения FixUp всякий раз, когда вы получаете данные из базы данных (и во многих случаях более). Это процесс, при котором EF автоматически заполняет свойства навигации (например, Subject.Exams) объектов в кеше.

Вы выборки экзаменов и предметы и EF любезно заселяет их SubjectsиExams соответственно. Невозможно остановить EF от этого (некоторые могут подумать, что настройка Configuration.AutoDetectChangesEnabled = false сделает это, но нет).

Обратите внимание, что вы не получаете больше экзаменов из базы данных, чем вы получаете от запроса, если это вас беспокоит. Просто EF создает ассоциации. В отладочном представлении вы можете неограниченно расширять коллекцию, не попадая в базу данных.

Решение не должно показывать Subject.Exams. Если это для сериализации, вам нужно заблокировать циклические ссылки. У некоторых сериализаторов (например, Json.Net) есть настройки для этого.

1

Благодарим всех вас за ответы.
Действительно, структура сущности не загружает больше экзаменов, чем ожидалось. Он просто заполняет суб-экзамены экзаменами, уже загруженными.
Моя проблема была на самом деле проблемой циклического ссылочного сериализатора. Я решил использовать DTO (с automapper), чтобы точно указать данные, которые мне нужны в моем представлении.

http://cpratt.co/using-automapper-getting-started/

+0

Лучше всего делать :) –

Смежные вопросы