2016-10-13 6 views
0

У меня есть BaseScript, в скрипте есть GetAll, который не загружает связанные объекты.Загрузка связанных объектов в BaseScript (DbContext)

В DbContext отключен LazyLodingEnabled (false).

Следуя коду, чтобы понять мою проблему. В этом примере он не загружает пользователя и messageViews, когда я хочу получать сообщения по языку.

BaseScript

public abstract class BaseScript<TEntity> where TEntity : EntityBase 
{ 
    public virtual IEnumerable<TEntity> GetAll() 
    { 
     using (EntityDbContext ctx = new EntityDbContext()) 
     { 
      return ctx.Set<TEntity>().ToList(); 
     } 
    } 
} 

MessageScript

public class MessageScript : BaseScript<Message> 
    { 
     public IEnumerable<Message> GetAllByLanguagePublic(string language) 
     { 
      return this.GetAllPublic().Where(x => x.Language == language).ToList(); 
     } 
    } 

объект Message: "Почему не User и MessageViews загружены"

public class Message : EntityBase 
{ 
    public string Text { get; set; } 
    public string Language { get; set; } 

    public virtual User User { get; set; } 
    public Guid UserId { get; set; } 

    public virtual ICollection<MessageView> MessageViews { get; set; } 
} 

ответ

1

Я полагаю, ваш вопрос Если это так, вы отвечаете на себя. Если отключить отложенную загрузку, вы должны загрузить эти свойства в явном виде, используя Include (например):

Может быть, в вашем BaseScript.GetAll вы хотите вернуть IQueryable вместо IEnumerable поэтому запроса не будет exectued пока (не позвоните по телефону ToList()). Затем в методе GetAllByLanguagePublic вы могли бы сделать это:

public class MessageScript : BaseScript<Message> 
{ 
    public IEnumerable<Message> GetAllByLanguagePublic(string language) 
    { 
     return this.GetAll() 
      .Include(x => x.User) 
      .Include(x => x.MessageViews) 
      .Where(x => x.Language == language).ToList(); 
    } 
} 

Обратите внимание, что вам нужно включить System.Data.Entity использовать Include с лямбда-выражения.

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