2016-12-22 8 views
1

Скажем, у меня есть 2 объектные модели -Entity отношения в Entity Framework код-первый

public class Blog 
{ 
    [Key] 
    public int BlogId { get; set; } 
    public string BlogName { get; set; } 
    public virtual ICollection<Post> Posts { get; set; } 
} 


public class Post 
{ 
    [Key] 
    public int PostId { get; set; } 
    public string PostName { get; set; } 
    public int BlogId { get; set; } 

    [ForeignKey("BlogId")] 
    public virtual Blog Blog { get; set; } 
} 

Давайте получить блог-

var blog = dbContext.Blogs.Where(r => r.BlogId == 1).FirstOrDefault(); 

код извлекает блог и все сообщения, а также. Но если в этом блоге есть тысячи сообщений? Это будет проблема производительности.

Есть ли какой-либо трюк, чтобы не загружать сообщения по умолчанию? Я не хочу удалить Posts Недвижимость от Blog.

Спасибо.

+0

Ну, если вы включили отложенной загрузки она не будет загружать коллекцию сообщений фронт, но это только задерживает полную нагрузку до тех пор, пока к нему доступ. Можете ли вы объяснить, почему вы не хотите просто удалить свойство? – Vlad274

+0

Как включить ленивую загрузку? –

+0

Откуда вы знаете, что уже тянут все сообщения? – Eris

ответ

0

Вы можете контролировать, какие дети загрузить с projection:

var blogWithSomeChildren = dbContext.Blogs 
            .Select(b => new 
            { 
             blog = b, 
             selectedPosts = b.Posts.Where(p => p.PostId > 500) // or whatever criteria you want... 
            }) 
            .Single(b => b.BlogId ==1); 
1

Вы можете достичь этого двумя путями.

  1. Ленивой Загрузка
  2. Явной загрузка

Ленивого Loading - DbContext имеет настройку конфигурации, которая позволяет отложенную загрузку DbContext.Configuration.LazyLoadingEnabled. Этот параметр является истинным по умолчанию, поэтому, если вы не изменили значение по умолчанию, динамический прокси-сервер будет выполнять ленивую загрузку. Для использования ленивой загрузки необходимо иметь две вещи, реализованные в ваших классах POCO.

  1. Ваши классы POCO должны быть общедоступными, а не закрытыми.
  2. Свойства навигации, которые вы хотите загрузить, также должны быть помечены как виртуальные (которые вы уже сделали), чтобы Entity Framework могла переопределить свойства, чтобы включить ленивую логику загрузки.

2- Явная загрузка - Явная нагрузка, как отложенной загрузки в том, что соответствующие данные загружаются отдельно, после того, как был загружен основные данные. Однако, в отличие от ленивой загрузки, это автоматически не произойдет для вас; вам нужно вызвать метод для загрузки данных.

Явная нагрузка достигается с использованием метода DbContext.Entry. Метод Entry дает вам доступ ко всей информации, которую DbContext имеет об объекте. Это выходит за пределы значений, которые хранятся в свойствах фактического объекта и включают такие вещи, как состояние объекта и исходные значения для каждого свойства, когда оно было извлечено из базы данных.

Ex:

var blog = dbContext.Blogs.Where(r => r.BlogId == 1).FirstOrDefault(); 

context.Entry(blog) 
.Collection(d => d.Posts) 
.Load(); 

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

  • Нет связанных вопросов^_^