Изменение типов идентификаторов сущностей

Коллеги, привет!

В ближайшем обновлении мы провели рефакторинг сущностей, базовых маппингов и сервисов для поддержки новых типов идентификаторов. Сейчас, кроме типа Int64 / bigint поддерживаются также типы Guid / uuid и String / text.

Мотивация изменений: все чаще приходят требования интеграции проектов на Платформе BarsUp.Net в существующий ландшафт заказчика. Для того, чтобы можно было использовать существующую СУБД PostgreSQL, нам необходимо обеспечить два основных момента:

  1. Импорт существующих схем БД и построение на основе них описателей сущностей в BarsUp.Designer
  2. Возможность при импорте поддержать колонки-идентификаторы с типом, отличным от bigint - а это, чаще всего, либо уникальные идентификаторы, либо строковые значения

EntityId

Для обеспечения совместимости с разными типами идентификаторов сущностей, был реализован тип BarsUp.Core.Abstractions.DataAccess.Entity.EntityId, который может принимать значение одного из типов:

  • Длинное целое число - Int64 - bigint - этот тип используется по умолчанию, ранее созданные таблицы при этом никак не меняются.
  • Уникальный идентификатор - Guid - uuid
  • Строка - String - text - для данного типа не задается генератор на уровне маппинга, поэтому разработчик должен самостоятельно гарантировать уникальность его значений. Это может быть реализовано как на уровне маппинга через стандартный IGeneratorDef, так и на уровне структуры таблицы через дефолтное значение и т.д.
  • Массив идентификаторов приведенных выше типов - для поддержки композитных первичных ключей

Тип EntityId используется как для идентификаторов сущностей, так и для идентификаторов DTO, передаваемых на клиент.
Для типа реализованы implicit-конвертеры в/из long/guid/string для обеспечения обратной совместимости на уровне кода - например если в коде используется числовой идентификатор в аргументах метода, то при передаче его в аргумент метода типа EntityId будет выполнена конвертация без ошибок приведения типов, обратное преобразование так же возможно.

public interface IDataStore 
{
...
Task<TEntity> GetAsync<TEntity>(EntityId id, CancellationToken cancellationToken = default)
        where TEntity : IEntity;
...
}
---
private async Task<JToken> CollectApplications(long entityId)
{
...
var entity = DataStore.GetAsync<Document>(entityId)
}

Маппинг сущностей

Базовые мапинги PersistentObjectMap и BaseEntityMap отнаследованы от EntityMapping и помечены как устаревшие, в следующих версиях они будут удалены.
Новый базовый класс для маппингов поддерживает как ручной маппинг, так и атрибутный.
Дополнительные маппинги из пространства имен BarsUp.Modules.Mappings удалены

Импорт существующей схемы БД

Для того, чтобы выполнить импорт ранее созданных таблиц, можно воспользоваться пунктом меню Модуля Сервис / Дополнительно / Импорт сущностей из существующей БД

В открывшемся окне нужно ввести параметры подключения к БД, после чего выбрать таблицы для импорта

После импорта в конструкторе будут созданы сущности с соответствующими типами идентификаторов. При этом, колонка-идентификатор будет определена по метаданным первичного ключа таблицы. Если первичного ключа нет - будет создано расширение которое позволит настроить композитный первичный ключ по импортированным свойствам.

2 Лайков