2016-10-13 2 views
0

나는 BaseScript를 가지고 있는데, Script에는 관련 엔티티를로드하지 않는 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(); 
     } 
    } 

메시지 엔티티 : "왜 UserMessageViews가로드되지 않습니다"

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

나는 당신의 질문은 가정 그렇다면 자신에게 대답하고있는 것입니다. 어쩌면 당신의 BaseScript.GetAll 대신 때문에 쿼리가 아직 exectued되지 않을 것 IEnumerableIQueryable을 반환하려면 (하지의

을 : 당신이 게으른 로딩을 사용하지 않도록 설정하면 (예를 들어) Include를 사용하여 명시 적으로 이러한 속성을로드해야 ToList()으로 전화하십시오). 그런 다음 GetAllByLanguagePublic 방법으로 당신이 할 수 있습니다 : 당신은 람다 식으로 Include를 사용하는 System.Data.Entity을 포함 할 필요가

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

참고.

관련 문제