2015-01-12 2 views
1

У меня есть две сущности разрешение и доступЧто включают в себя() работа метода в Entity Framework

Access.cs

public class Access 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public List<Permission> PermissionList { get; set; } 
} 

Permission.cs

public class Permission 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public int ParentId { get; set; } 

    [NotMapped] 
    public bool HasChildren { get; set; } 

    [NotMapped] 
    public List<Permission> ChildPermissions { get; set; } 
} 

У меня также есть Класс GenericRepository для фильтрации записей в моей базе данных.

GenericRepository.cs

public virtual IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      string includeProperties = "", bool tracking = true) 
     { 
      IQueryable<TEntity> query = dbSet; 


      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      { 
       query = query.Include(includeProperty); 
      } 
     /*...*/ 
     } 

Я называю этот метод в моем классе Service Access

AccessService.cs

GenericRepository<Access> accessRepo = new GenericRepository<Access>(); 
List<Access> accessList = accessRepo.Get(d => d.Name == accessName, null, "PermissionList").OrderBy(d => d.Id).ToList(); 

Этот код фильтров типа записей из "Доступ" а затем использует метод Include() с параметром PermissionList в Generic Repository. Что включает в себя (метод PermissionList)? Что он делает? PermissionList является свойством Access и имеет тип элементов Permission. Но я не мог достичь цели.

ответ

9

Он предназначен для активной загрузки связанных объектов.

См. Entity Framework Loading Related Entities.

Если не используя Include(), этот запрос:

using (var context = new YourContext()) 
{ 
    var access = context.Access.Single(a => a.ID == 42);  
} 

бы вернуть Access экземпляр с пустым PermissionList собственности. В зависимости от того, как настроен ваш контекст, эта коллекция останется пустой (без ленивой загрузки) или будет ленивой, как только вы ее получите (foreach (var permission in access.PermissionList) { ... }).

Теперь Include():

using (var context = new YourContext()) 
{ 
    var access = context.Access.Include(a => a.PermissionList) 
           .Single(a => a.ID == 42);  
} 

Запрос будет записан в качестве соединения, загрузив все связанные с ними права для вас.

Метод Include() расширение также имеет перегрузку строки, которые ваше хранилище кода вызывающую:

query = query.Include(includeProperty); 

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

+1

И перед тем, как «не использовать репозитории с Entity Framework». – CodeCaster

+0

Спасибо за ваше объяснение. – user2923864

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