IContextEntityService<TEntity> — сервис работы с сущностями в контексте текущей операции.
Сервис используется внутри динамического кода (например, в CustomHooks, ScheduledJob и LifecycleRoleResolver) и предоставляет безопасный доступ к операциям над сущностями.
Все операции выполняются:
DbContext;public interface IContextEntityService<TEntity> where TEntity : class, IEntity
{
Task<TEntity> InsertAsync(TEntity detachedEntity, bool checkRights = true);
Task<TEntity> UpdateAsync(TEntity detachedEntity, bool checkRights = true);
Task<TEntity> DeleteAsync(Guid entityId, bool checkRights = true);
Task<TEntity> GetAsync(Guid entityId, bool checkRights = true);
IQueryable<TEntity> Get(
Expression<Func<TEntity, bool>> condition = null,
bool checkRights = true
);
Task CheckCanInsertAsync(TEntity entity);
Task CheckCanEditAsync(TEntity entity);
Task CheckCanEditAsync(Guid entityId);
Task CheckCanDeleteAsync(TEntity entity);
Task CheckCanExecuteAsync(Guid entityId, string granular);
Task CheckCanViewAsync(Guid entityId, string granularName = null);
Task<IQueryable<TCollectionType>> GetNavigationAsync<TCollectionType>(
Guid key,
Expression<Func<TCollectionType, Guid>> foreignKeyExpression
) where TCollectionType : Entity;
Task<List<TCollectionType>> UpdateNavigationAsync<TCollectionType>(
Guid key,
Expression<Func<TCollectionType, Guid>> foreignKeyExpression,
ICollection<TCollectionType> collection,
Func<TCollectionType, object> groupByExpression = null
) where TCollectionType : Entity;
}
Основные операции работы с сущностями:
Создаёт новую сущность.
Task<TEntity> InsertAsync(TEntity detachedEntity, bool checkRights = true)
Параметры:
detachedEntity — новая сущность, не привязанная к DbContext;checkRights — определяет, необходимо ли проверять права пользователя.Метод возвращает сущность, добавленную в контекст.
Обновляет существующую сущность на основе переданной модели.
Task<TEntity> UpdateAsync(TEntity detachedEntity, bool checkRights = true)
detachedEntity должен содержать идентификатор существующей сущности.
Удаляет сущность по идентификатору.
Task<TEntity> DeleteAsync(Guid entityId, bool checkRights = true)
Получает сущность по идентификатору.
Task<TEntity> GetAsync(Guid entityId, bool checkRights = true)
Возвращает IQueryable<TEntity> для построения запросов.
IQueryable<TEntity> Get(
Expression<Func<TEntity, bool>> condition = null,
bool checkRights = true
)
Особенности:
NoTracking);condition позволяет задать предикат фильтрации.Пример:
var service = context.GetEntityService<Project>();
var projects = service
.Get(p => p.StatusId == statusId)
.ToList();
Методы проверки прав позволяют проверить возможность выполнения операции без фактического изменения данных.
Если пользователь не обладает необходимыми правами — выбрасывается исключение.
Доступные проверки:
Проверяет право на создание сущности.
Task CheckCanInsertAsync(TEntity entity)
Проверяет право редактирования сущности.
Task CheckCanEditAsync(TEntity entity)
Task CheckCanEditAsync(Guid entityId)
Проверяет право удаления сущности.
Task CheckCanDeleteAsync(TEntity entity)
Проверяет право выполнения действия над сущностью.
Task CheckCanExecuteAsync(Guid entityId, string granular)
granular — имя гранулярного права.
Проверяет право просмотра сущности.
Task CheckCanViewAsync(Guid entityId, string granularName = null)
Сервис также предоставляет методы для работы с навигационными коллекциями.
Получает связанные сущности.
Task<IQueryable<TCollectionType>> GetNavigationAsync<TCollectionType>(
Guid key,
Expression<Func<TCollectionType, Guid>> foreignKeyExpression
)
Параметры:
key — идентификатор основной сущности;foreignKeyExpression — выражение, определяющее внешний ключ.Пример:
var tasks = await projectService.GetNavigationAsync<ProjectTask>(
projectId,
t => t.ProjectId
);
Обновляет связанную коллекцию сущностей.
Task<List<TCollectionType>> UpdateNavigationAsync<TCollectionType>(
Guid key,
Expression<Func<TCollectionType, Guid>> foreignKeyExpression,
ICollection<TCollectionType> collection,
Func<TCollectionType, object> groupByExpression = null
)
Метод:
Параметры:
key — идентификатор основной сущности;foreignKeyExpression — выражение внешнего ключа;collection — новая коллекция элементов;groupByExpression — функция группировки элементов (используется для корректного обновления коллекций).Перейти на русскую версию?