Коллеги, привет!
В ближайшем обновлении мы провели рефакторинг сущностей, базовых маппингов и сервисов для поддержки новых типов идентификаторов. Сейчас, кроме типа Int64 / bigint
поддерживаются также типы Guid / uuid
и String / text
.
Мотивация изменений: все чаще приходят требования интеграции проектов на Платформе BarsUp.Net в существующий ландшафт заказчика. Для того, чтобы можно было использовать существующую СУБД PostgreSQL, нам необходимо обеспечить два основных момента:
- Импорт существующих схем БД и построение на основе них описателей сущностей в BarsUp.Designer
- Возможность при импорте поддержать колонки-идентификаторы с типом, отличным от
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 удалены
Импорт существующей схемы БД
Для того, чтобы выполнить импорт ранее созданных таблиц, можно воспользоваться пунктом меню Модуля Сервис / Дополнительно / Импорт сущностей из существующей БД
В открывшемся окне нужно ввести параметры подключения к БД, после чего выбрать таблицы для импорта
После импорта в конструкторе будут созданы сущности с соответствующими типами идентификаторов. При этом, колонка-идентификатор будет определена по метаданным первичного ключа таблицы. Если первичного ключа нет - будет создано расширение которое позволит настроить композитный первичный ключ по импортированным свойствам.