Отобранные модификации ТС

Доменная сущность Версия: 0.1 draft

Отобранные для расчёта модификации ТС: какие модификации справочника «Марка, модель и модификация ТС» участвуют в расчёте расхода топлива.

⟨/⟩ Исходник

1. Назначение

Связь «Расчёт ТС → Модификация ТС»: какие модификации справочника участвуют в расчёте. Базовая норма расхода топлива — среднее базовых норм отобранных модификаций (секция методики fuel.base_norm).

Связь смоделирована отдельной сущностью, а не коллекцией в VehicleCalc: у неё две колонки-ключа, и так структура хранения видна явно — без интерпретации навигационной коллекции в связующую таблицу.

Идентификатор и уникальность. Сущность следует общей инфраструктурной конвенции (BaseEntity) наравне со всеми остальными доменными сущностями модуля — суррогатный Id, не композитный ключ из двух FK. Это техническое решение, не бизнес-атрибут связи. Отдельно, именно как ограничение целостности — пара (VehicleCalc, VehicleModification) уникальна: одна и та же модификация не может быть отобрана для одного расчёта ТС более одного раза. Раньше это гарантировал сам композитный первичный ключ; с суррогатным Id это нужно задавать явно (уникальный индекс на паре колонок), иначе ограничение пропадёт незаметно.

Связи

classDiagram
    direction LR
    class SelectedModifications {
        +Guid id
        +VehicleCalc vehicle_calc_id
        +VehicleModification vehicle_modification_id
    }
    class VehicleCalc
    class VehicleModification
    SelectedModifications "1" --> "1" VehicleCalc : vehicle_calc_id
    SelectedModifications "1" --> "1" VehicleModification : vehicle_modification_id

Структура

НаименованиеАтрибутТипОбязательно для созданияДиапазон / форматНеизменяемостьОписание
Идентификатор записиidGuidДаUUIDДа
Расчёт ТСvehicle_calc_idVehicleCalcДаUUIDДаВместе с VehicleModification — уникальная пара (см. «Идентификатор и уникальность» документа)
Отобранная модификация ТСvehicle_modification_idVehicleModificationДаUUIDДаВместе с VehicleCalc — уникальная пара (см. «Идентификатор и уникальность» документа)

Исходник

    public class SelectedModifications
    {
        /// <summary>Идентификатор записи</summary>
        [DomainField(Alias = "id", RequiredOnCreate = true, Range = "UUID", Immutable = true)]
        public Guid Id { get; set; }

        /// <summary>Расчёт ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_calc_id", RequiredOnCreate = true, Range = "UUID", Immutable = true,
            Description = "Вместе с VehicleModification — уникальная пара (см. «Идентификатор и уникальность» документа)")]
        public VehicleCalc? VehicleCalc { get; set; }

        /// <summary>Отобранная модификация ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_modification_id", RequiredOnCreate = true, Range = "UUID", Immutable = true,
            Description = "Вместе с VehicleCalc — уникальная пара (см. «Идентификатор и уникальность» документа)")]
        public VehicleModification? VehicleModification { get; set; }
    }