Вызов DbContext.Set <T>(). Include () не запрашивает включенные свойства? - PullRequest
4 голосов
/ 23 марта 2012

Я отключил отложенную загрузку и создание прокси на моем DbContext. Я использую репозиторий partern и UnitOfWork. Мой UnitOfWork наследуется от DBConext. Вот пример того, что я делаю:

public class User
{
     public Guid Id {get;set;}
     public virtual Guid UserTypeId {get;set;} //foreign key to UserType and setup in the EF fluent mappings and it does load if I am using lazy loading.
     public virtual UserType {get;set;}
}

public class UserType
{
     public Guid Id {get;set;}
     public string Name {get;set;}
}

Это внутри моего UoW:

        public IDbSet<TEntity> CreateSet<TEntity>() where TEntity : class
        {
            return base.Set<TEntity>();
        }

Я запрашиваю контекст через мой репозиторий:

 protected Expression<Func<TEntity, object>>[] Includes;
 public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> criteria, params Expression<Func<TEntity, object>>[] includes)
        {
            Includes = includes;
            return GetSet().Where(criteria)
                            .AsEnumerable();
        }

    public IDbSet<TEntity> GetSet()
            {
                var set = _unitOfWork.CreateSet<TEntity>();

                if(Includes != null)
                {
                    foreach (var include in Includes)
                    {
                        set.Include(include);
                    }
                }

                return set;

            }

Итак, как вы можете видеть, я передаю массив выражений для включения в мой запрос. Так что я мог бы назвать это так:

var users = userRespository.Get(u => u.Id == SomeGuid, u => u.UserType);

UserType не включен в запрос, и я не знаю что. Должен ли я вызывать что-то кроме Set на DbContext?

Обновление :

Я думаю, прежде чем позвонить в базу. Набор, мне нужно добавить туда включения. Хотя не уверен.

1 Ответ

3 голосов
/ 23 марта 2012

Все методы расширений на IQueryable обычно работают так, как они производят новый IQueryable, поэтому вы должны назначить его, если хотите получить эффект:

public IDbSet<TEntity> GetSet()
{
    var set = _unitOfWork.CreateSet<TEntity>();

    if(Includes != null)
    {
        foreach (var include in Includes)
        {
            set = set.Include(include);
        }
    }

    return set;
}

Кстати.это выглядит очень похоже на мое старое решение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...