Менеджер сущностей (entitymanager) — как не выстрелить в ногу

Для работы с сущностью из базы данных в ELMA есть «Менеджер сущностей» — EntityManager который поддерживает стандартные операции Создание/Обновление/удаление/Выборка и так далее, но есть нюансы из-за которых вы легко выстрелите себе в ногу, а иногда и в голову.

Два интерфейса реализует универсальный менеджер EntityManager<T>(где T это IEntity).

  • IEntityManager — базовый интерфейс менеджера сущностей
  • IEntityManager<T> — шаблонный интерфейс менеджера сущностей (вместо T — нужно подставить ваш тип сущности)

Если вы их не видели, советую взглянуть на их методы — возможно о некоторых вы не знали и уже успели где-то накостылять)) Они сэкономят вам время, а о часто используемых и нюансах я расскажу ниже.

Над каждым методом есть комментарий, так что не заблудитесь, а я расскажу про самые часто используемые:

LoadOrNull

var admin  = EntityManager<EleWise.ELMA.Security.Models.User>.Instance
            .LoadOrNull(EleWise.ELMA.Security.SecurityConstants.AdminUserUid);

Код вернет пользователя — администратора системы, LoadOrNull на вход принимает long или Guid, помните об этом, именно long а не int т.к. иначе получите ошибку — ELMA не поняла что вы имеете ввиду.

У сущностей может быть два идентификатора:

  • Id — типа long, есть всегда и уникальный в пределах одной базы данных
  • Uid — типа Guid, есть только если включена опция «Поддержка импорта-экспорта», уникальна для любой базы данных, собственно как раз для поддержки импорт/экспорта

Также плюсом будет то что в отличие от просто  Load он не выбросит вам исключение.

FindAll()

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

var firstContractor  = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                      .FindAll().FirstOrDefault();

Этот код для получения одного контрагента сначала достанет всех из базы данных с помощью  FindAll() (сложит в оперативную память) а потом возьмет первого…

Представьте что будет если контрагентов хотя бы 10000.
— насколько хватит оперативной памяти? — если максимум значений long.MaxValue

Find

Самый часто используемый метод, у него есть несколько перегрузок, рассмотрим на примере получения созданных сегодня контрагентов.

У каждого метода есть свои плюсы и минусы и они подходят для разных случаев — для каких вы решите сами, только помните что:

  • Find вернет вам из базы данных записи по фильтру, и лучше чтобы это был минимум записей — иначе ваша программа будет работать до завтра.

Find(Expression<Func<T, bool>> condition)

Принимает лямбда выражение с условиями для выборки

var todayContractors = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                      .Find(c => c.CreationDate > DateTime.Today);

Find(string eqlFilter)

Принимает EQL фильтр, разбирает его и фильтрует, поддерживает также фильтрацию по связанным атрибутам про него расскажу отдельно позже

var todayContractors = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                      .Find("CreationDate > DateTime('Today')");

Find(IEntityFilter filter, FetchOptions fetchOptions)

Принимает на фильтр объект содержащий поля фильтра

var filter = Services.InterfaceActivator.Create<EleWise.ELMA.CRM.Models.ContractorFilter>();
filter.CreationDate = new Ranges.DateTimeRange(DateTime.Now, null);
var todayContractors = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                      .Find(filter, FetchOptions.All).FirstOrDefault();

На деле это тот же фильтр что и в справочнике, только его нужно заполнить кодом.

Projection(string propertyName)

Этот метод возвращает проекцию одного атрибута сущности — это работает намного быстрее в отличие от Find но к сожалению нельзя предварительно отфильтровать данные для проекции.

Следующий код вернет список идентификаторов контрагентов.

var allIdsContractor = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                      .Projection<long>("Id");

Count

У него два варианта это просто Count() и Count(IEntityFilter filter), плюсом конечно же будет то что он работает гораздо быстрее Find, т.к. возвращает только количество записей.
Следующий код вернет количество контрагентов созданных сегодня.

var filter = Services.InterfaceActivator.Create<EleWise.ELMA.CRM.Models.ContractorFilter>();
filter.CreationDate = new Ranges.DateTimeRange(DateTime.Now, null);
var countTodayContractors = EntityManager<EleWise.ELMA.CRM.Models.Contractor>.Instance
                           .Count(filter);

Если вам интересно узнать про какой то еще из методов пишите, я расскажу.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

%d такие блоггеры, как:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: