< Summary

Information
Class: OzonRepositories.Context.ApplicationDbContext
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Context/ApplicationDbContext.cs
Line coverage
99%
Covered lines: 996
Uncovered lines: 2
Coverable lines: 998
Total lines: 1162
Line coverage: 99.7%
Branch coverage
75%
Covered branches: 3
Total branches: 4
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Orders()100%11100%
get_Products()100%11100%
get_Currencys()100%11100%
get_Warehouses()100%11100%
get_AppStatuses()100%11100%
get_ClientStatuses()100%11100%
get_Suppliers()100%11100%
get_ApiSupplierSettings()100%11100%
get_ApiSupplierRequestAuditEntries()100%11100%
get_SupplierQuotationRequests()100%11100%
get_SupplierQuotationOffers()100%11100%
get_ArmtekDeliveryAddressMappings()100%11100%
get_ApiSupplierWarehouses()100%11100%
get_ArmtekSettlements()100%11100%
get_ArmtekInvoices()100%11100%
get_ArmtekInvoiceItems()100%11100%
get_ArmtekEtpSyncRuns()100%11100%
get_FidSupplierLinks()100%11100%
get_FidSupplierLinkSettings()100%11100%
get_Transactions()100%11100%
get_OzonClients()100%11100%
get_AccessProfiles()100%11100%
get_DataScopeSets()100%11100%
get_DataScopeSetItems()100%11100%
get_ColumnMappings()100%11100%
get_Manufacturers()100%11100%
get_OrdersFileMetadata()100%11100%
get_MatchedRows()100%11100%
get_MatchedResults()100%11100%
get_MatchingColumns()100%11100%
get_SavedMatchingColumns()100%11100%
get_FileUploadRecords()100%11100%
get_OrderCarts()100%11100%
get_OrderItems()100%11100%
get_CartStatuses()100%11100%
get_ItemStatuses()100%11100%
get_StatusColors()100%11100%
get_ExcludedArticles()100%11100%
get_ExcelMappings()100%11100%
get_PriceHistories()100%11100%
get_OrderHistories()100%11100%
get_WarehouseMappings()100%11100%
get_Deliveries()100%11100%
get_DeliveryProviders()100%11100%
get_ExcludedBitrixWarehouses()100%11100%
get_EtProducers()100%11100%
get_OrderArchives()100%11100%
get_OrderPrices()100%11100%
get_OrderOzonPromotionSnapshots()100%11100%
get_OrderOzonPromotionConditions()100%11100%
get_PriceIndexes()100%11100%
get_OrderExtensions()100%11100%
get_BitrixStockSavedFilters()100%11100%
get_ExpenseTypes()100%11100%
get_OrderExtraExpenses()100%11100%
get_OrdersGridUserSettings()100%11100%
get_UserSidebarSettings()100%11100%
get_StatusTransitions()100%11100%
get_StatusTransitionHistory()100%11100%
get_TransactionTypeSettings()100%11100%
get_Shipments()100%11100%
get_OzonChatOrders()100%11100%
get_OzonChatResponseStatistics()100%11100%
get_OzonChatResponseTimes()100%11100%
get_OrderReturns()100%11100%
get_OrderReturnSyncRuns()100%11100%
get_OzonHandoverImportBatches()100%11100%
get_OzonHandoverActs()100%11100%
get_OzonHandoverActItems()100%11100%
get_OzonHandoverActItemPhotos()100%11100%
get_OrderShipmentTotals()100%11100%
get_OrderCalculationSnapshots()100%11100%
get_OrderHistoryOneCPostings()100%11100%
get_OrderHistoryOneCPostingLinks()100%11100%
get_OneCNomenclatureMaps()100%11100%
get_OneCProducerAliases()100%11100%
get_InterpartsWarehouseLogins()100%11100%
get_InterpartsSutCurrencies()100%11100%
get_OzonPushNotifications()100%11100%
get_OzonPostingCancellations()100%11100%
get_OzonPostingCancellationOrders()100%11100%
get_EmailRoutingRules()100%11100%
get_EmailMessageInboxes()100%11100%
get_EmailAttachmentInboxes()100%11100%
get_EmailAttachmentProcessingResults()100%11100%
get_EmailRoutingJobExecutions()100%11100%
get_TransactionTimeTrackingSessions()100%11100%
get_TransactionTimeTrackingResults()100%11100%
get_WarehouseStockSnapshots()100%11100%
get_WarehouseStockSyncRuns()100%11100%
get_BackgroundJobSchedules()100%11100%
get_BackgroundJobExecutions()100%11100%
get_BackgroundJobSteps()100%11100%
get_BackgroundReportLoads()100%11100%
get_BackgroundOrderMatches()100%11100%
get_BackgroundTransactionResults()100%11100%
get_OrderSearchSyncStates()100%11100%
get_OrderControlRules()100%11100%
get_OrderControlTasks()100%11100%
get_OrderControlTaskEvents()100%11100%
get_OrderControlSettings()100%11100%
get_OrderControlExecutions()100%11100%
get_SystemAlertIncidents()100%11100%
get_SystemMonitoringSignals()100%11100%
get_ArmtekCartItems()100%11100%
get_ArmtekOrders()100%11100%
get_ArmtekOrderItems()100%11100%
get_MlAutoCartItems()100%11100%
get_MlAutoOrders()100%11100%
get_MlAutoRuCartItems()100%11100%
get_MlAutoRuOrders()100%11100%
get_MlAutoOrderItems()100%11100%
get_MlAutoDeliveryAddressMappings()100%11100%
get_MlAutoRuDeliveryAddressMappings()100%11100%
get_ForumAutoCartItems()100%11100%
get_ForumAutoOrders()100%11100%
get_ForumAutoOrderItems()100%11100%
get_FavoritPartsCartItems()100%11100%
get_FavoritPartsOrders()100%11100%
get_FavoritPartsOrderItems()100%11100%
get_ProfitLigaCartItems()100%11100%
get_ProfitLigaOrders()100%11100%
get_ProfitLigaOrderItems()100%11100%
get_ProfitLigaPointMappings()100%11100%
get_NikeiCartItems()100%11100%
get_MikadoCartItems()100%11100%
get_ZZapCartItems()100%11100%
get_MoskvorechieIstraCartItems()100%11100%
get_MoskvorechieIstraOrders()100%11100%
get_MoskvorechieIstraOrderItems()100%11100%
get_MotexCartItems()100%11100%
get_MotexOrders()100%11100%
get_MotexOrderItems()100%11100%
get_ShateMCartItems()100%11100%
get_ShateMOrders()100%11100%
get_ShateMOrderItems()100%11100%
get_BergCartItems()100%11100%
get_BergOrders()100%11100%
get_BergOrderItems()100%11100%
get_BergDeliveryAddressMappings()100%11100%
get_SupplierStatuses()100%11100%
get_OrderSupplierStates()100%11100%
get_OrderSupplierStateHistory()100%11100%
get_SupplierOrderIntents()100%11100%
get_BitrixStockClearExecutions()100%11100%
get_BitrixStockClearItems()100%11100%
get_BitrixStockArchiveExecutions()100%11100%
get_BitrixStockArchiveItems()100%11100%
get_BitrixStockUnarchiveExecutions()100%11100%
get_BitrixStockUnarchiveItems()100%11100%
get_BitrixStockPushExecutions()100%11100%
get_BitrixStockPushItems()100%11100%
get_BitrixStockAutoSchedules()100%11100%
get_BitrixStockAutoScheduleRuns()100%11100%
get_FidStatSnapshots()100%11100%
get_FidStatItems()100%11100%
get_AppPages()100%11100%
get_AppFields()100%11100%
get_DataScopes()100%11100%
get_AppRoles()100%11100%
get_RolePagePermissions()100%11100%
get_RoleFieldPermissions()100%11100%
get_RoleDataScopes()100%11100%
get_UserAppRoles()100%11100%
get_UserPageOverrides()100%11100%
get_UserFieldOverrides()100%11100%
get_UserDataScopes()100%11100%
get_AuditLogEntries()100%11100%
get_LabelPrintLogs()100%11100%
get_AssemblyListRuns()100%11100%
get_AssemblyListRunItems()100%11100%
get_AssemblyListAccessKeys()100%11100%
get_Partners()100%11100%
get_PartnerRules()100%11100%
get_PartnerRuleConditions()100%11100%
get_PartnerPermissions()100%11100%
get_PartnerAuditLogs()100%11100%
get_PartnerLoginCodes()100%11100%
.ctor()100%210%
.ctor(...)100%11100%
ConfigurePartnerOffice(...)100%11100%
OnModelCreating(...)100%22100%
ConfigureAuthorizationModel(...)100%11100%
IsMySqlProvider(...)50%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Context/ApplicationDbContext.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains;
 3using OzonDomains.Models;
 4using OzonDomains.Models.AccessControl;
 5using OzonDomains.Models.ArmtekEtp;
 6using OzonDomains.Models.Authorization;
 7using OzonDomains.Models.MatchedRowSys;
 8using OzonDomains.Models.OrderCarts;
 9using OzonDomains.Models.OzonHandover;
 10using OzonDomains.Models.SupplierStatuses;
 11using OzonRepositories.Authorization;
 12using OzonRepositories.Data.Bitrix;
 13
 14namespace OzonRepositories.Context
 15{
 16    public class ApplicationDbContext : DbContext
 17    {
 18
 635519        public DbSet<Order> Orders { get; set; }
 238320        public DbSet<Product> Products { get; set; }
 230521        public DbSet<Currency> Currencys { get; set; }
 268022        public DbSet<Warehouse> Warehouses { get; set; }
 231923        public DbSet<AppStatus> AppStatuses { get; set; }
 236424        public DbSet<ClientStatus> ClientStatuses { get; set; }
 244325        public DbSet<Supplier> Suppliers { get; set; }
 245526        public DbSet<ApiSupplierSettings> ApiSupplierSettings { get; set; }
 233327        public DbSet<ApiSupplierRequestAuditEntry> ApiSupplierRequestAuditEntries { get; set; } = null!;
 231028        public DbSet<SupplierQuotationRequest> SupplierQuotationRequests { get; set; } = null!;
 230429        public DbSet<SupplierQuotationOffer> SupplierQuotationOffers { get; set; } = null!;
 243930        public DbSet<ArmtekDeliveryAddressMapping> ArmtekDeliveryAddressMappings { get; set; }
 234631        public DbSet<ApiSupplierWarehouse> ApiSupplierWarehouses { get; set; } = null!;
 232732        public DbSet<ArmtekSettlement> ArmtekSettlements { get; set; } = null!;
 233833        public DbSet<ArmtekInvoice> ArmtekInvoices { get; set; } = null!;
 231734        public DbSet<ArmtekInvoiceItem> ArmtekInvoiceItems { get; set; } = null!;
 232235        public DbSet<ArmtekEtpSyncRun> ArmtekEtpSyncRuns { get; set; } = null!;
 236736        public DbSet<FidSupplierLink> FidSupplierLinks { get; set; } = null!;
 231337        public DbSet<FidSupplierLinkSettings> FidSupplierLinkSettings { get; set; } = null!;
 235938        public DbSet<Transaction> Transactions { get; set; }
 249539        public DbSet<OzonClient> OzonClients { get; set; }
 230840        public DbSet<AccessProfile> AccessProfiles { get; set; }
 230441        public DbSet<DataScopeSet> DataScopeSets { get; set; }
 230242        public DbSet<DataScopeSetItem> DataScopeSetItems { get; set; }
 230343        public DbSet<ColumnMapping> ColumnMappings { get; set; }
 245244        public DbSet<Manufacturer> Manufacturers { get; set; }
 230245        public DbSet<OrdersFileMetadata> OrdersFileMetadata { get; set; }
 230246        public DbSet<MatchedRow> MatchedRows { get; set; }
 230247        public DbSet<MatchedResult> MatchedResults { get; set; }
 230248        public DbSet<MatchingColumn> MatchingColumns { get; set; }
 230249        public DbSet<SavedMatchingColumn> SavedMatchingColumns { get; set; }
 233750        public DbSet<FileUploadRecord> FileUploadRecords { get; set; }
 230251        public DbSet<OrderCart> OrderCarts { get; set; }
 230252        public DbSet<OrderItem> OrderItems { get; set; }
 230253        public DbSet<CartStatus> CartStatuses { get; set; }
 230254        public DbSet<ItemStatus> ItemStatuses { get; set; }
 231355        public DbSet<StatusColor> StatusColors { get; set; }
 230256        public DbSet<ExcludedArticle> ExcludedArticles { get; set; }
 230257        public DbSet<ExcelMapping> ExcelMappings { get; set; }
 230258        public DbSet<PriceHistory> PriceHistories { get; set; }
 241459        public virtual DbSet<OrderHistory> OrderHistories { get; set; }
 242560        public DbSet<WarehouseMapping> WarehouseMappings { get; set; }
 230461        public DbSet<Delivery> Deliveries { get; set; }
 230262        public DbSet<DeliveryProvider> DeliveryProviders { get; set; }
 230263        public DbSet<ExcludedBitrixWarehouse> ExcludedBitrixWarehouses { get; set; }
 234564        public DbSet<EtProducer> EtProducers { get; set; }
 234865        public DbSet<OrderArchive> OrderArchives { get; set; }
 230266        public DbSet<OrderPrice> OrderPrices { get; set; }
 230267        public DbSet<OrderOzonPromotionSnapshot> OrderOzonPromotionSnapshots { get; set; } = null!;
 230268        public DbSet<OrderOzonPromotionCondition> OrderOzonPromotionConditions { get; set; } = null!;
 230269        public DbSet<PriceIndexes> PriceIndexes { get; set; }
 231070        public DbSet<OrderExtension> OrderExtensions { get; set; }
 230271        public DbSet<BitrixStockSavedFilter> BitrixStockSavedFilters { get; set; }
 230272        public DbSet<ExpenseType> ExpenseTypes { get; set; }
 230273        public DbSet<OrderExtraExpense> OrderExtraExpenses { get; set; }
 74
 75        /// <summary>Настройки страницы заказов на AG Grid по пользователю (раскладка, пресеты, последний фильтр).</summ
 232476        public DbSet<OrdersGridUserSetting> OrdersGridUserSettings { get; set; }
 77
 78        /// <summary>Настройки бокового меню по пользователю (избранное, порядок, свёрнутые группы, pin).</summary>
 230279        public DbSet<UserSidebarSetting> UserSidebarSettings { get; set; }
 230380        public DbSet<StatusTransition> StatusTransitions { get; set; }
 232881        public DbSet<StatusTransitionHistory> StatusTransitionHistory { get; set; }
 82
 83        /// <summary>Имена/иконки/флаг нового грида по типу транзакции (админка /Studio2/TransactionTypeSettings).</summ
 236784        public DbSet<TransactionTypeSetting> TransactionTypeSettings { get; set; }
 234285        public DbSet<Shipment> Shipments { get; set; }
 230486        public DbSet<OzonChatOrder> OzonChatOrders { get; set; }
 230487        public DbSet<OzonChatResponseStatistic> OzonChatResponseStatistics { get; set; }
 230288        public DbSet<OzonChatResponseTime> OzonChatResponseTimes { get; set; }
 234889        public DbSet<OrderReturn> OrderReturns { get; set; }
 233190        public DbSet<OrderReturnSyncRun> OrderReturnSyncRuns { get; set; }
 232591        public DbSet<OzonHandoverImportBatch> OzonHandoverImportBatches { get; set; }
 230292        public DbSet<OzonHandoverAct> OzonHandoverActs { get; set; }
 230793        public DbSet<OzonHandoverActItem> OzonHandoverActItems { get; set; }
 230394        public DbSet<OzonHandoverActItemPhoto> OzonHandoverActItemPhotos { get; set; }
 230295        public DbSet<OrderShipmentTotals> OrderShipmentTotals { get; set; }
 230596        public DbSet<OrderCalculationSnapshot> OrderCalculationSnapshots { get; set; }
 238197        public DbSet<OrderHistoryOneCPosting> OrderHistoryOneCPostings { get; set; }
 230298        public DbSet<OrderHistoryOneCPostingLink> OrderHistoryOneCPostingLinks { get; set; }
 230299        public DbSet<OneCNomenclatureMap> OneCNomenclatureMaps { get; set; } = null!;
 2308100        public DbSet<OneCProducerAlias> OneCProducerAliases { get; set; } = null!;
 2302101        public DbSet<InterpartsWarehouseLogin> InterpartsWarehouseLogins { get; set; }
 2302102        public DbSet<InterpartsSutCurrency> InterpartsSutCurrencies { get; set; }
 2347103        public DbSet<OzonPushNotification> OzonPushNotifications { get; set; }
 5218104        public DbSet<OzonPostingCancellation> OzonPostingCancellations { get; set; } = null!;
 2353105        public DbSet<OzonPostingCancellationOrder> OzonPostingCancellationOrders { get; set; } = null!;
 2308106        public DbSet<EmailRoutingRule> EmailRoutingRules { get; set; }
 2337107        public DbSet<EmailMessageInbox> EmailMessageInboxes { get; set; }
 2316108        public DbSet<EmailAttachmentInbox> EmailAttachmentInboxes { get; set; }
 2304109        public DbSet<EmailAttachmentProcessingResult> EmailAttachmentProcessingResults { get; set; }
 2320110        public DbSet<EmailRoutingJobExecution> EmailRoutingJobExecutions { get; set; }
 2382111        public DbSet<TransactionTimeTrackingSession> TransactionTimeTrackingSessions { get; set; }
 2333112        public DbSet<TransactionTimeTrackingResult> TransactionTimeTrackingResults { get; set; }
 2363113        public DbSet<WarehouseStockSnapshot> WarehouseStockSnapshots { get; set; }
 2337114        public DbSet<WarehouseStockSyncRun> WarehouseStockSyncRuns { get; set; }
 115
 116        // Background Jobs System
 2333117        public DbSet<BackgroundJobSchedule> BackgroundJobSchedules { get; set; }
 2346118        public DbSet<BackgroundJobExecution> BackgroundJobExecutions { get; set; }
 2302119        public DbSet<BackgroundJobStep> BackgroundJobSteps { get; set; }
 2302120        public DbSet<BackgroundReportLoad> BackgroundReportLoads { get; set; }
 2302121        public DbSet<BackgroundOrderMatch> BackgroundOrderMatches { get; set; }
 2313122        public DbSet<BackgroundTransactionResult> BackgroundTransactionResults { get; set; }
 123
 2313124        public DbSet<OrderSearchSyncState> OrderSearchSyncStates { get; set; }
 2333125        public DbSet<OrderControlRule> OrderControlRules { get; set; } = null!;
 2706126        public DbSet<OrderControlTask> OrderControlTasks { get; set; } = null!;
 2916127        public DbSet<OrderControlTaskEvent> OrderControlTaskEvents { get; set; } = null!;
 2319128        public DbSet<OrderControlSettings> OrderControlSettings { get; set; } = null!;
 2302129        public DbSet<OrderControlExecution> OrderControlExecutions { get; set; } = null!;
 2417130        public DbSet<SystemAlertIncident> SystemAlertIncidents { get; set; } = null!;
 2353131        public DbSet<SystemMonitoringSignal> SystemMonitoringSignals { get; set; } = null!;
 2354132        public DbSet<ArmtekCartItem> ArmtekCartItems { get; set; } = null!;
 2335133        public DbSet<ArmtekOrder> ArmtekOrders { get; set; } = null!;
 2403134        public DbSet<ArmtekOrderItem> ArmtekOrderItems { get; set; } = null!;
 2309135        public DbSet<MlAutoCartItem> MlAutoCartItems { get; set; } = null!;
 2319136        public DbSet<MlAutoOrder> MlAutoOrders { get; set; } = null!;
 2404137        public DbSet<MlAutoRuCartItem> MlAutoRuCartItems { get; set; } = null!;
 2355138        public DbSet<MlAutoRuOrder> MlAutoRuOrders { get; set; } = null!;
 2339139        public DbSet<MlAutoOrderItem> MlAutoOrderItems { get; set; } = null!;
 2343140        public DbSet<MlAutoDeliveryAddressMapping> MlAutoDeliveryAddressMappings { get; set; } = null!;
 2346141        public DbSet<MlAutoRuDeliveryAddressMapping> MlAutoRuDeliveryAddressMappings { get; set; } = null!;
 2335142        public DbSet<ForumAutoCartItem> ForumAutoCartItems { get; set; } = null!;
 2324143        public DbSet<ForumAutoOrder> ForumAutoOrders { get; set; } = null!;
 2314144        public DbSet<ForumAutoOrderItem> ForumAutoOrderItems { get; set; } = null!;
 2339145        public DbSet<FavoritPartsCartItem> FavoritPartsCartItems { get; set; } = null!;
 2332146        public DbSet<FavoritPartsOrder> FavoritPartsOrders { get; set; } = null!;
 2329147        public DbSet<FavoritPartsOrderItem> FavoritPartsOrderItems { get; set; } = null!;
 2441148        public DbSet<ProfitLigaCartItem> ProfitLigaCartItems { get; set; } = null!;
 2357149        public DbSet<ProfitLigaOrder> ProfitLigaOrders { get; set; } = null!;
 2308150        public DbSet<ProfitLigaOrderItem> ProfitLigaOrderItems { get; set; } = null!;
 2414151        public DbSet<ProfitLigaPointMapping> ProfitLigaPointMappings { get; set; } = null!;
 2414152        public DbSet<NikeiCartItem> NikeiCartItems { get; set; } = null!;
 2332153        public DbSet<MikadoCartItem> MikadoCartItems { get; set; } = null!;
 2453154        public DbSet<ZZapCartItem> ZZapCartItems { get; set; } = null!;
 2396155        public DbSet<MoskvorechieIstraCartItem> MoskvorechieIstraCartItems { get; set; } = null!;
 2379156        public DbSet<MoskvorechieIstraOrder> MoskvorechieIstraOrders { get; set; } = null!;
 2320157        public DbSet<MoskvorechieIstraOrderItem> MoskvorechieIstraOrderItems { get; set; } = null!;
 2370158        public DbSet<MotexCartItem> MotexCartItems { get; set; } = null!;
 2329159        public DbSet<MotexOrder> MotexOrders { get; set; } = null!;
 2305160        public DbSet<MotexOrderItem> MotexOrderItems { get; set; } = null!;
 2370161        public DbSet<ShateMCartItem> ShateMCartItems { get; set; } = null!;
 2315162        public DbSet<ShateMOrder> ShateMOrders { get; set; } = null!;
 2302163        public DbSet<ShateMOrderItem> ShateMOrderItems { get; set; } = null!;
 2341164        public DbSet<BergCartItem> BergCartItems { get; set; } = null!;
 2329165        public DbSet<BergOrder> BergOrders { get; set; } = null!;
 2348166        public DbSet<BergOrderItem> BergOrderItems { get; set; } = null!;
 2354167        public DbSet<BergDeliveryAddressMapping> BergDeliveryAddressMappings { get; set; } = null!;
 2621168        public DbSet<SupplierStatus> SupplierStatuses { get; set; } = null!;
 2932169        public DbSet<OrderSupplierState> OrderSupplierStates { get; set; } = null!;
 2371170        public DbSet<OrderSupplierStateHistory> OrderSupplierStateHistory { get; set; } = null!;
 2476171        public DbSet<SupplierOrderIntent> SupplierOrderIntents { get; set; } = null!;
 172
 2316173        public DbSet<BitrixStockClearExecution> BitrixStockClearExecutions { get; set; }
 2302174        public DbSet<BitrixStockClearItem> BitrixStockClearItems { get; set; }
 2302175        public DbSet<BitrixStockArchiveExecution> BitrixStockArchiveExecutions { get; set; }
 2302176        public DbSet<BitrixStockArchiveItem> BitrixStockArchiveItems { get; set; }
 2302177        public DbSet<BitrixStockUnarchiveExecution> BitrixStockUnarchiveExecutions { get; set; }
 2302178        public DbSet<BitrixStockUnarchiveItem> BitrixStockUnarchiveItems { get; set; }
 2317179        public DbSet<BitrixStockPushExecution> BitrixStockPushExecutions { get; set; }
 2510180        public DbSet<BitrixStockPushItem> BitrixStockPushItems { get; set; }
 2311181        public DbSet<BitrixStockAutoSchedule> BitrixStockAutoSchedules { get; set; }
 2310182        public DbSet<BitrixStockAutoScheduleRun> BitrixStockAutoScheduleRuns { get; set; }
 183
 184        // Статистика фидов
 2302185        public DbSet<FidStatSnapshot> FidStatSnapshots { get; set; }
 2302186        public DbSet<FidStatItem> FidStatItems { get; set; }
 187
 188        // Новая система авторизации (Authorization)
 2367189        public DbSet<AppPage> AppPages { get; set; } = null!;
 2326190        public DbSet<AppField> AppFields { get; set; } = null!;
 2309191        public DbSet<DataScope> DataScopes { get; set; } = null!;
 2399192        public DbSet<AppRole> AppRoles { get; set; } = null!;
 2335193        public DbSet<RolePagePermission> RolePagePermissions { get; set; } = null!;
 2337194        public DbSet<RoleFieldPermission> RoleFieldPermissions { get; set; } = null!;
 2334195        public DbSet<RoleDataScope> RoleDataScopes { get; set; } = null!;
 2689196        public DbSet<UserAppRole> UserAppRoles { get; set; } = null!;
 2330197        public DbSet<UserPageOverride> UserPageOverrides { get; set; } = null!;
 2330198        public DbSet<UserFieldOverride> UserFieldOverrides { get; set; } = null!;
 2342199        public DbSet<UserDataScope> UserDataScopes { get; set; } = null!;
 2302200        public DbSet<AuditLogEntry> AuditLogEntries { get; set; } = null!;
 2307201        public DbSet<LabelPrintLog> LabelPrintLogs { get; set; } = null!;
 202
 203        // Листы подбора FBS
 2302204        public DbSet<AssemblyListRun> AssemblyListRuns { get; set; } = null!;
 2302205        public DbSet<AssemblyListRunItem> AssemblyListRunItems { get; set; } = null!;
 2302206        public DbSet<AssemblyListAccessKey> AssemblyListAccessKeys { get; set; } = null!;
 2540207        public DbSet<OzonDomains.Models.Partners.Partner> Partners { get; set; } = null!;
 2373208        public DbSet<OzonDomains.Models.Partners.PartnerRule> PartnerRules { get; set; } = null!;
 2302209        public DbSet<OzonDomains.Models.Partners.PartnerRuleCondition> PartnerRuleConditions { get; set; } = null!;
 2318210        public DbSet<OzonDomains.Models.Partners.PartnerPermission> PartnerPermissions { get; set; } = null!;
 2399211        public DbSet<OzonDomains.Models.Partners.PartnerAuditLog> PartnerAuditLogs { get; set; } = null!;
 2387212        public DbSet<OzonDomains.Models.Partners.PartnerLoginCode> PartnerLoginCodes { get; set; } = null!;
 213
 0214        public ApplicationDbContext()
 215        {
 0216        }
 217
 218        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
 2302219            : base(options)
 220        {
 2302221        }
 222
 223        private static void ConfigurePartnerOffice(ModelBuilder modelBuilder)
 224        {
 12225            modelBuilder.Entity<OzonDomains.Models.Partners.Partner>(e =>
 12226            {
 12227                e.HasIndex(x => x.Login).IsUnique();
 12228                e.HasIndex(x => x.GoogleEmail);
 12229                e.HasIndex(x => x.Email).IsUnique();
 12230                e.HasMany(x => x.LoginCodes).WithOne(x => x.Partner).HasForeignKey(x => x.PartnerId).OnDelete(DeleteBeha
 12231                e.HasMany(x => x.Rules).WithOne(x => x.Partner).HasForeignKey(x => x.PartnerId).OnDelete(DeleteBehavior.
 12232                e.HasMany(x => x.Permissions).WithOne(x => x.Partner).HasForeignKey(x => x.PartnerId).OnDelete(DeleteBeh
 24233            });
 12234            modelBuilder.Entity<OzonDomains.Models.Partners.PartnerRule>(e =>
 24235                e.HasMany(x => x.Conditions).WithOne(x => x.Rule).HasForeignKey(x => x.RuleId).OnDelete(DeleteBehavior.C
 12236            modelBuilder.Entity<OzonDomains.Models.Partners.PartnerPermission>(e =>
 24237                e.HasIndex(x => new { x.PartnerId, x.Code }).IsUnique());
 12238            modelBuilder.Entity<OzonDomains.Models.Partners.PartnerLoginCode>(e =>
 24239                e.HasIndex(x => new { x.PartnerId, x.CreatedAtUtc }));
 12240            modelBuilder.Entity<OzonDomains.Models.Partners.PartnerAuditLog>(e =>
 12241            {
 12242                e.HasIndex(x => x.OccurredAtUtc);
 12243                e.HasIndex(x => new { x.PartnerId, x.OccurredAtUtc });
 24244            });
 12245        }
 246
 247        protected override void OnModelCreating(ModelBuilder modelBuilder)
 248        {
 12249            ConfigurePartnerOffice(modelBuilder);
 12250            modelBuilder.Entity<Shipment>(e =>
 12251            {
 12252                e.HasIndex(x => x.ShipmentNumber)
 12253                    .IsUnique()
 12254                    .HasDatabaseName("UX_Shipments_ShipmentNumber");
 24255            });
 12256            modelBuilder.Entity<SystemAlertIncident>(e =>
 12257            {
 12258                e.HasIndex(x => new { x.Key, x.IsActive });
 12259                e.HasIndex(x => x.LastObservedAtUtc);
 24260            });
 24261            modelBuilder.Entity<SystemMonitoringSignal>(e => e.HasIndex(x => new { x.SourceKey, x.OccurredAtUtc }));
 12262            modelBuilder.Entity<LabelPrintLog>(e =>
 12263            {
 12264                e.HasIndex(x => new { x.FileName, x.OccurredAtUtc });
 12265                e.HasIndex(x => new { x.OrderId, x.OccurredAtUtc });
 24266            });
 12267            modelBuilder.Entity<ApiSupplierSettings>()
 12268                .HasIndex(x => x.ProviderKey)
 12269                .IsUnique();
 12270            modelBuilder.Entity<ApiSupplierSettings>()
 12271                .Property(x => x.PriceMultiplier)
 12272                .HasPrecision(10, 4);
 12273            modelBuilder.Entity<ApiSupplierSettings>()
 12274                .HasOne(x => x.Supplier)
 12275                .WithMany()
 12276                .HasForeignKey(x => x.SupplierId)
 12277                .OnDelete(DeleteBehavior.SetNull);
 12278            modelBuilder.Entity<ApiSupplierRequestAuditEntry>(e =>
 12279            {
 12280                e.ToTable("ApiSupplierRequestAudit");
 12281                e.HasIndex(x => new { x.ProviderKey, x.OccurredAtUtc });
 12282                e.HasIndex(x => new { x.IsSuccess, x.OccurredAtUtc });
 12283                e.Property(x => x.Request).HasColumnType("longtext");
 12284                e.Property(x => x.Response).HasColumnType("longtext");
 24285            });
 12286            modelBuilder.Entity<SupplierQuotationRequest>()
 12287                .HasIndex(x => new { x.ProductId, x.RequestedAtUtc });
 12288            modelBuilder.Entity<SupplierQuotationRequest>()
 12289                .HasIndex(x => new { x.OrderId, x.RequestedAtUtc });
 12290            modelBuilder.Entity<SupplierQuotationRequest>()
 12291                .HasOne(x => x.Product).WithMany().HasForeignKey(x => x.ProductId).OnDelete(DeleteBehavior.Restrict);
 12292            modelBuilder.Entity<SupplierQuotationRequest>()
 12293                .HasOne(x => x.Order).WithMany().HasForeignKey(x => x.OrderId).OnDelete(DeleteBehavior.Restrict);
 12294            modelBuilder.Entity<SupplierQuotationRequest>()
 12295                .HasOne(x => x.Supplier).WithMany().HasForeignKey(x => x.SupplierId).OnDelete(DeleteBehavior.SetNull);
 12296            modelBuilder.Entity<SupplierQuotationOffer>()
 12297                .HasIndex(x => x.RequestId);
 12298            modelBuilder.Entity<SupplierQuotationOffer>()
 12299                .HasOne(x => x.Request).WithMany(x => x.Offers).HasForeignKey(x => x.RequestId).OnDelete(DeleteBehavior.
 12300            modelBuilder.Entity<ArmtekDeliveryAddressMapping>()
 12301                .HasIndex(x => new { x.ProviderKey, x.ShipmentWarehouseId })
 12302                .IsUnique();
 12303            modelBuilder.Entity<ArmtekDeliveryAddressMapping>()
 12304                .HasOne(x => x.ShipmentWarehouse)
 12305                .WithMany()
 12306                .HasForeignKey(x => x.ShipmentWarehouseId)
 12307                .OnDelete(DeleteBehavior.Restrict);
 12308            modelBuilder.Entity<ApiSupplierWarehouse>()
 12309                .HasIndex(x => new { x.ProviderKey, x.WarehouseId })
 12310                .IsUnique();
 12311            modelBuilder.Entity<ApiSupplierWarehouse>()
 12312                .HasOne(x => x.Warehouse)
 12313                .WithMany()
 12314                .HasForeignKey(x => x.WarehouseId)
 12315                .OnDelete(DeleteBehavior.Cascade);
 12316            modelBuilder.Entity<ArmtekSettlement>(e =>
 12317            {
 12318                e.HasIndex(x => new { x.Kunnr, x.Vbeln }).IsUnique();
 12319                e.HasIndex(x => x.DocDate);
 24320            });
 12321            modelBuilder.Entity<ArmtekInvoice>(e =>
 12322            {
 12323                e.HasIndex(x => new { x.Kunnr, x.Vbeln }).IsUnique();
 12324                e.HasMany(x => x.Items).WithOne(x => x.Invoice).HasForeignKey(x => x.InvoiceId).OnDelete(DeleteBehavior.
 24325            });
 12326            modelBuilder.Entity<ArmtekInvoiceItem>().HasIndex(x => x.OrderNumber);
 12327            modelBuilder.Entity<ArmtekEtpSyncRun>().HasIndex(x => new { x.Success, x.StartedAtUtc });
 12328            modelBuilder.Entity<FidSupplierLink>().HasIndex(x => x.FidSupplierName).IsUnique();
 12329            modelBuilder.Entity<FidSupplierLink>().HasIndex(x => x.ProviderKey);
 330            // Одна строка настроек: Id задаётся приложением, автоинкремент не нужен.
 12331            modelBuilder.Entity<FidSupplierLinkSettings>().Property(x => x.Id).ValueGeneratedNever();
 12332            modelBuilder.Entity<MlAutoDeliveryAddressMapping>()
 12333                .HasIndex(x => x.ShipmentWarehouseId).IsUnique();
 12334            modelBuilder.Entity<MlAutoDeliveryAddressMapping>()
 12335                .HasOne(x => x.ShipmentWarehouse).WithMany().HasForeignKey(x => x.ShipmentWarehouseId)
 12336                .OnDelete(DeleteBehavior.Restrict);
 12337            modelBuilder.Entity<MlAutoRuDeliveryAddressMapping>()
 12338                .HasIndex(x => x.ShipmentWarehouseId).IsUnique();
 12339            modelBuilder.Entity<MlAutoRuDeliveryAddressMapping>()
 12340                .HasOne(x => x.ShipmentWarehouse).WithMany().HasForeignKey(x => x.ShipmentWarehouseId)
 12341                .OnDelete(DeleteBehavior.Restrict);
 342
 12343            modelBuilder
 12344                .Entity<Order>()
 24345                .ToTable("Orders", t => t.IsTemporal());
 12346            modelBuilder.Entity<Order>()
 12347                .HasIndex(o => o.Key);
 348            // Поиск заказа по штрихкоду ScanIt с этикетки (поле «Номер заказа» в гриде).
 12349            modelBuilder.Entity<Order>()
 12350                .HasIndex(o => o.Scanit)
 12351                .HasDatabaseName("IX_Orders_Scanit");
 352            // Дельта-опрос грида заказов и инкрементальный синк ES: WHERE UpdatedAt > @since.
 12353            modelBuilder.Entity<Order>()
 12354                .HasIndex(o => o.UpdatedAt)
 12355                .HasDatabaseName("IX_Orders_UpdatedAt");
 356            // Загрузка заказов (OrdersDataServices): WHERE Article = @article на каждый заказ; без индекса — полный ска
 12357            modelBuilder.Entity<Order>()
 12358                .HasIndex(o => o.Article)
 12359                .HasDatabaseName("IX_Orders_Article");
 12360            modelBuilder.Entity<OzonPostingCancellation>()
 12361                .HasIndex(x => x.EventFingerprint)
 12362                .IsUnique();
 12363            modelBuilder.Entity<OzonPostingCancellation>()
 12364                .HasIndex(x => new { x.OzonClientId, x.PostingNumber });
 12365            modelBuilder.Entity<OzonPostingCancellation>()
 12366                .HasOne(x => x.OzonClient)
 12367                .WithMany()
 12368                .HasForeignKey(x => x.OzonClientId)
 12369                .OnDelete(DeleteBehavior.Restrict);
 12370            modelBuilder.Entity<OzonPostingCancellationOrder>()
 12371                .HasKey(x => new { x.CancellationId, x.OrderId });
 12372            modelBuilder.Entity<OzonPostingCancellationOrder>()
 12373                .HasIndex(x => x.OrderId);
 12374            modelBuilder.Entity<OzonPostingCancellationOrder>()
 12375                .HasOne(x => x.Cancellation)
 12376                .WithMany(x => x.OrderLinks)
 12377                .HasForeignKey(x => x.CancellationId)
 12378                .OnDelete(DeleteBehavior.Cascade);
 12379            modelBuilder.Entity<OzonPostingCancellationOrder>()
 12380                .HasOne(x => x.Order)
 12381                .WithMany()
 12382                .HasForeignKey(x => x.OrderId)
 12383                .OnDelete(DeleteBehavior.Cascade);
 12384            modelBuilder.Entity<Order>()
 12385                .HasOne(o => o.EtProducer)
 12386                .WithMany()
 12387                .HasForeignKey(o => o.EtProducerId)
 12388                .OnDelete(DeleteBehavior.Restrict);
 389
 12390            modelBuilder.Entity<OrderArchive>()
 12391                .HasOne(oa => oa.Order)
 12392                .WithOne(o => o.OrderArchive)
 12393                .HasForeignKey<OrderArchive>(oa => oa.OrderId)
 12394                .OnDelete(DeleteBehavior.Cascade);
 395
 12396            modelBuilder.Entity<OrderArchive>()
 12397                .HasIndex(oa => oa.OrderId)
 12398                .IsUnique();
 399
 12400            modelBuilder.Entity<OrderArchive>()
 12401                .HasIndex(oa => oa.ArchivedAt);
 402
 403            // На один заказ приходится несколько строк цен: в боевой БД 16 234 заказа
 404            // имеют больше одной записи в OrderPrices. Индекс здесь неуникальный —
 405            // раньше модель объявляла его уникальным и физически не разворачивалась.
 12406            modelBuilder.Entity<OrderPrice>()
 12407                .HasIndex(op => op.OrderId);
 408
 12409            modelBuilder.Entity<OrderOzonPromotionSnapshot>(entity =>
 12410            {
 12411                entity.HasIndex(x => x.OrderId).IsUnique();
 12412                entity.HasIndex(x => new { x.HasAnyPromotion, x.CapturedAt });
 12413                entity.HasIndex(x => new { x.OzonClientId, x.OzonProductId });
 12414                entity.HasOne(x => x.Order)
 12415                    .WithOne(x => x.OzonPromotionSnapshot)
 12416                    .HasForeignKey<OrderOzonPromotionSnapshot>(x => x.OrderId)
 12417                    .OnDelete(DeleteBehavior.Cascade);
 24418            });
 419
 12420            modelBuilder.Entity<OrderOzonPromotionCondition>(entity =>
 12421            {
 12422                entity.HasIndex(x => new { x.SnapshotId, x.SourceType });
 12423                entity.HasIndex(x => new { x.SourceType, x.ExternalActionId });
 12424                entity.HasOne(x => x.Snapshot)
 12425                    .WithMany(x => x.Conditions)
 12426                    .HasForeignKey(x => x.SnapshotId)
 12427                    .OnDelete(DeleteBehavior.Cascade);
 24428            });
 429
 430            // Неуникальный — как в боевой БД. Дублей сейчас нет, но уникальности
 431            // ни код, ни схема не гарантировали.
 12432            modelBuilder.Entity<PriceIndexes>()
 12433                .HasIndex(pi => pi.OrderPriceId);
 434
 435            // Первичный ключ — суррогатный Id (как в БД), а не пара OrderId+Key.
 436            // С составным ключом EF считал автоинкрементный Id обычным свойством
 437            // и на любой вставке через контекст подставил бы Id = 0.
 12438            modelBuilder.Entity<OrderExtension>(entity =>
 12439            {
 12440                entity.HasKey(e => e.Id);
 12441                entity.HasIndex(e => new { e.OrderId, e.Key }).IsUnique();
 24442            });
 443
 12444            modelBuilder.Entity<Order>()
 12445                .HasMany(o => o.OrderExtensions)
 12446                .WithOne(e => e.Order)
 12447                .HasForeignKey(e => e.OrderId)
 12448                .OnDelete(DeleteBehavior.Cascade);
 449
 450            // Примечание: Уникальность заказов обеспечивается на уровне приложения в методе AddOrders
 451            // Логика уникальности:
 452            // - Для YANDEX: по полю Key (где Key не null)
 453            // - Для остальных: по комбинации Article + TrimShipmentNumber(ShipmentNumber)
 454            // Уникальный индекс на уровне БД не создается, так как логика требует TrimShipmentNumber,
 455            // что невозможно реализовать на уровне БД без вычисляемых колонок.
 456
 457            // Self-referencing foreign key для Product (кросскод/замена артикула)
 12458            modelBuilder.Entity<Product>()
 12459                .HasOne(p => p.ReplacementProduct)
 12460                .WithMany(p => p.ReplacedProducts)
 12461                .HasForeignKey(p => p.ReplacementProductId)
 12462                .OnDelete(DeleteBehavior.Restrict);
 463
 464            // StatusTransition: переходы между статусами
 12465            modelBuilder.Entity<StatusTransition>(entity =>
 12466            {
 24467                entity.ToTable(t => t.HasCheckConstraint(
 24468                    "CHK_StatusTransitions_DifferentStatuses",
 24469                    "`FromStatusId` <> `ToStatusId`"));
 12470                entity.HasOne(st => st.FromStatus)
 12471                    .WithMany()
 12472                    .HasForeignKey(st => st.FromStatusId)
 12473                    .OnDelete(DeleteBehavior.Restrict);
 12474                entity.HasOne(st => st.ToStatus)
 12475                    .WithMany()
 12476                    .HasForeignKey(st => st.ToStatusId)
 12477                    .OnDelete(DeleteBehavior.Restrict);
 12478                entity.HasIndex(st => new { st.FromStatusId, st.ToStatusId, st.TransactionType })
 12479                    .IsUnique();
 24480            });
 481
 482            // StatusTransitionHistory (StatusTransition опционален для ручного изменения статуса)
 12483            modelBuilder.Entity<StatusTransitionHistory>()
 12484                .HasOne(h => h.StatusTransition)
 12485                .WithMany()
 12486                .HasForeignKey(h => h.StatusTransitionId)
 12487                .IsRequired(false)
 12488                .OnDelete(DeleteBehavior.Restrict);
 12489            modelBuilder.Entity<StatusTransitionHistory>()
 12490                .HasOne(h => h.FromStatus)
 12491                .WithMany()
 12492                .HasForeignKey(h => h.FromStatusId)
 12493                .OnDelete(DeleteBehavior.Restrict);
 12494            modelBuilder.Entity<StatusTransitionHistory>()
 12495                .HasOne(h => h.ToStatus)
 12496                .WithMany()
 12497                .HasForeignKey(h => h.ToStatusId)
 12498                .OnDelete(DeleteBehavior.Restrict);
 12499            modelBuilder.Entity<StatusTransitionHistory>()
 12500                .HasIndex(h => new { h.EntityType, h.EntityId });
 12501            modelBuilder.Entity<StatusTransitionHistory>()
 12502                .HasIndex(h => h.PerformedAt);
 503
 504            // OzonChatOrder: связь чатов и заказов
 12505            modelBuilder.Entity<OzonChatOrder>()
 12506                .HasIndex(x => x.ChatId);
 12507            modelBuilder.Entity<OzonChatOrder>()
 12508                .HasIndex(x => x.OrderId);
 12509            modelBuilder.Entity<OzonChatOrder>()
 12510                .HasIndex(x => x.ClientId);
 12511            modelBuilder.Entity<OzonChatOrder>()
 12512                .HasIndex(x => x.PostingNumber);
 513            // Неуникальный: в боевой базе 54 пары (ChatId, OrderId) задвоены.
 514            // Уникальный индекс здесь физически не создать, пока дубли не вычищены.
 12515            modelBuilder.Entity<OzonChatOrder>()
 12516                .HasIndex(x => new { x.ChatId, x.OrderId });
 12517            modelBuilder.Entity<OzonChatOrder>()
 12518                .HasIndex(x => new { x.IsActive, x.ClientId });
 12519            modelBuilder.Entity<OzonChatOrder>()
 12520                .Property(x => x.CreatedAt)
 12521                .HasDefaultValueSql("CURRENT_TIMESTAMP");
 12522            modelBuilder.Entity<OzonChatOrder>()
 12523                .Property(x => x.UpdatedAt)
 12524                .HasDefaultValueSql("CURRENT_TIMESTAMP");
 525
 526            // OrderReturn: возвраты Ozon, связь с Order
 12527            modelBuilder.Entity<OrderReturn>()
 12528                .HasIndex(x => x.OzonReturnId)
 12529                .IsUnique();
 12530            modelBuilder.Entity<OrderReturn>()
 12531                .HasIndex(x => x.OrderId);
 12532            modelBuilder.Entity<OrderReturn>()
 12533                .HasIndex(x => x.PostingNumber);
 12534            modelBuilder.Entity<OrderReturn>()
 12535                .HasIndex(x => x.OzonClientId);
 12536            modelBuilder.Entity<OrderReturn>()
 12537                .HasIndex(x => x.VisualStatusSysName);
 538            // Составные — под fallback-поиск в UpsertBatchFromOzonReturnsAsync, когда возврат
 539            // не нашёлся по OzonReturnId. Одиночного индекса по PostingNumber там мало.
 12540            modelBuilder.Entity<OrderReturn>()
 12541                .HasIndex(x => new { x.OzonClientId, x.PostingNumber });
 12542            modelBuilder.Entity<OrderReturn>()
 12543                .HasIndex(x => new { x.OzonClientId, x.OrderNumber });
 544            // Фильтр по периоду на /Studio2/OrderReturns и в фильтрах заказов.
 12545            modelBuilder.Entity<OrderReturn>()
 12546                .HasIndex(x => x.VisualStatusChangeMoment);
 547            // OrderByDescending(UpdatedAt) — разрешение дублей в upsert и OrderReturnInfoService.
 12548            modelBuilder.Entity<OrderReturn>()
 12549                .HasIndex(x => x.UpdatedAt);
 12550            modelBuilder.Entity<OrderReturn>()
 12551                .Property(x => x.CreatedAt)
 12552                .HasDefaultValueSql("CURRENT_TIMESTAMP");
 12553            modelBuilder.Entity<OrderReturn>()
 12554                .Property(x => x.UpdatedAt)
 12555                .HasDefaultValueSql("CURRENT_TIMESTAMP");
 556
 12557            modelBuilder.Entity<OrderReturnSyncRun>()
 12558                .HasIndex(x => x.StartedAtUtc);
 12559            modelBuilder.Entity<OrderReturnSyncRun>()
 12560                .HasIndex(x => x.Status);
 561
 12562            modelBuilder.Entity<WarehouseStockSyncRun>()
 12563                .HasIndex(x => x.StartedAtUtc);
 12564            modelBuilder.Entity<WarehouseStockSyncRun>()
 12565                .HasIndex(x => x.Status);
 566
 12567            modelBuilder.Entity<WarehouseStockSnapshot>()
 12568                .HasIndex(x => x.RowKey)
 12569                .IsUnique();
 12570            modelBuilder.Entity<WarehouseStockSnapshot>()
 12571                .HasIndex(x => x.Article);
 12572            modelBuilder.Entity<WarehouseStockSnapshot>()
 12573                .HasIndex(x => x.Warehouse);
 12574            modelBuilder.Entity<WarehouseStockSnapshot>()
 12575                .HasIndex(x => x.SyncedAtUtc);
 12576            modelBuilder.Entity<WarehouseStockSnapshot>()
 12577                .HasIndex(x => x.Manufacturer);
 12578            modelBuilder.Entity<WarehouseStockSnapshot>()
 12579                .HasOne(x => x.SyncRun)
 12580                .WithMany(x => x.SnapshotRows)
 12581                .HasForeignKey(x => x.SyncRunId)
 12582                .OnDelete(DeleteBehavior.Restrict);
 583
 12584            modelBuilder.Entity<InterpartsWarehouseLogin>()
 12585                .HasIndex(x => x.WarehouseId)
 12586                .IsUnique();
 12587            modelBuilder.Entity<InterpartsWarehouseLogin>()
 12588                .HasOne(x => x.Warehouse)
 12589                .WithMany()
 12590                .HasForeignKey(x => x.WarehouseId)
 12591                .OnDelete(DeleteBehavior.Cascade);
 592
 593            // OrderShipmentTotals: допускаем историю (много записей на один OrderId)
 12594            modelBuilder.Entity<OrderShipmentTotals>()
 12595                .HasIndex(x => x.OrderId)
 12596                .IsUnique(false);
 597
 12598            modelBuilder.Entity<OrderCalculationSnapshot>()
 12599                .HasIndex(x => new { x.OrderId, x.OperationId })
 12600                .IsUnique();
 12601            modelBuilder.Entity<OrderCalculationSnapshot>()
 12602                .HasIndex(x => x.OperationId);
 603
 12604            modelBuilder.Entity<OrderHistoryOneCPosting>()
 12605                .HasMany(p => p.HistoryLinks)
 12606                .WithOne(l => l.Posting)
 12607                .HasForeignKey(l => l.PostingId)
 12608                .OnDelete(DeleteBehavior.Cascade);
 609
 12610            modelBuilder.Entity<OrderHistoryOneCPostingLink>()
 12611                .HasOne(l => l.OrderHistory)
 12612                .WithMany()
 12613                .HasForeignKey(l => l.OrderHistoryId)
 12614                .OnDelete(DeleteBehavior.Cascade);
 615
 12616            modelBuilder.Entity<OrderHistoryOneCPostingLink>()
 12617                .HasIndex(l => new { l.PostingId, l.OrderHistoryId })
 12618                .IsUnique();
 619
 620            // Ключ поиска карточки 1С: пара «нормализованный артикул + производитель» уникальна.
 12621            modelBuilder.Entity<OneCNomenclatureMap>()
 12622                .HasIndex(m => new { m.ArticleNorm, m.ProducerNorm })
 12623                .IsUnique();
 12624            modelBuilder.Entity<OneCNomenclatureMap>()
 12625                .HasIndex(m => m.OneCRefKey);
 12626            modelBuilder.Entity<OneCNomenclatureMap>()
 12627                .HasIndex(m => m.ArticleNorm);
 628
 12629            modelBuilder.Entity<OneCProducerAlias>()
 12630                .HasIndex(a => a.AliasNorm)
 12631                .IsUnique();
 632
 633            // FidStatSnapshot → FidStatItems
 12634            modelBuilder.Entity<FidStatSnapshot>()
 12635                .HasMany(s => s.Items)
 12636                .WithOne(i => i.Snapshot)
 12637                .HasForeignKey(i => i.SnapshotId)
 12638                .OnDelete(DeleteBehavior.Cascade);
 12639            modelBuilder.Entity<FidStatSnapshot>()
 12640                .HasIndex(s => s.FidName);
 12641            modelBuilder.Entity<FidStatSnapshot>()
 12642                .HasIndex(s => s.PostTime);
 12643            modelBuilder.Entity<FidStatItem>()
 12644                .HasIndex(i => i.SnapshotId);
 645
 646            // DataScopeSet ↔ AccessProfile: many-to-many через явную join-таблицу
 12647            modelBuilder.Entity<AccessProfile>()
 12648                .HasMany(ap => ap.DataScopeSets)
 12649                .WithMany(s => s.AccessProfiles)
 24650                .UsingEntity(j => j.ToTable("AccessProfileDataScopeSets"));
 651
 652            // DataScopeSetItem: FK к DataScopeSet с каскадным удалением
 12653            modelBuilder.Entity<DataScopeSetItem>()
 12654                .HasOne(i => i.DataScopeSet)
 12655                .WithMany(s => s.Items)
 12656                .HasForeignKey(i => i.DataScopeSetId)
 12657                .OnDelete(DeleteBehavior.Cascade);
 658
 659            // Email routing
 12660            modelBuilder.Entity<EmailRoutingRule>()
 12661                .HasIndex(x => new { x.IsActive, x.Priority });
 662
 12663            modelBuilder.Entity<EmailMessageInbox>()
 12664                .HasIndex(x => x.MessageExternalId)
 12665                .IsUnique();
 12666            modelBuilder.Entity<EmailMessageInbox>()
 12667                .HasIndex(x => x.CreatedAt);
 12668            modelBuilder.Entity<EmailMessageInbox>()
 12669                .HasIndex(x => x.ProcessingStatus);
 670
 12671            modelBuilder.Entity<EmailAttachmentInbox>()
 12672                .HasIndex(x => x.EmailMessageInboxId);
 12673            modelBuilder.Entity<EmailAttachmentInbox>()
 12674                .HasIndex(x => new { x.Sha256Hash, x.FileSizeBytes, x.FileName });
 12675            modelBuilder.Entity<EmailAttachmentInbox>()
 12676                .HasOne(x => x.EmailMessage)
 12677                .WithMany(x => x.Attachments)
 12678                .HasForeignKey(x => x.EmailMessageInboxId)
 12679                .OnDelete(DeleteBehavior.Cascade);
 680
 12681            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12682                .HasIndex(x => x.EmailMessageInboxId);
 12683            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12684                .HasIndex(x => x.EmailAttachmentInboxId);
 12685            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12686                .HasIndex(x => x.EmailRoutingRuleId);
 12687            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12688                .HasIndex(x => x.Status);
 12689            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12690                .HasOne(x => x.EmailMessage)
 12691                .WithMany()
 12692                .HasForeignKey(x => x.EmailMessageInboxId)
 12693                .OnDelete(DeleteBehavior.Cascade);
 12694            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12695                .HasOne(x => x.Attachment)
 12696                .WithMany(x => x.ProcessingResults)
 12697                .HasForeignKey(x => x.EmailAttachmentInboxId)
 12698                .OnDelete(DeleteBehavior.Cascade);
 12699            modelBuilder.Entity<EmailAttachmentProcessingResult>()
 12700                .HasOne(x => x.Rule)
 12701                .WithMany()
 12702                .HasForeignKey(x => x.EmailRoutingRuleId)
 12703                .OnDelete(DeleteBehavior.SetNull);
 704
 12705            modelBuilder.Entity<EmailRoutingJobExecution>()
 12706                .HasIndex(x => x.StartedAtUtc);
 12707            modelBuilder.Entity<EmailRoutingJobExecution>()
 12708                .HasIndex(x => x.Status);
 709
 12710            modelBuilder.Entity<OrderControlRule>(e =>
 12711            {
 12712                e.HasIndex(x => x.Code).IsUnique();
 12713                e.HasIndex(x => new { x.IsActive, x.RuleType });
 12714                e.HasOne(x => x.TargetAppRole).WithMany().HasForeignKey(x => x.TargetAppRoleId)
 12715                    .OnDelete(DeleteBehavior.Restrict);
 24716            });
 12717            modelBuilder.Entity<OrderControlTask>(e =>
 12718            {
 12719                e.HasIndex(x => x.DeduplicationKey).IsUnique();
 12720                e.HasIndex(x => new { x.Status, x.DueAtUtc });
 12721                e.HasIndex(x => new { x.TargetAppRoleId, x.Status });
 12722                e.HasOne(x => x.Rule).WithMany().HasForeignKey(x => x.RuleId).OnDelete(DeleteBehavior.Restrict);
 12723                e.HasOne(x => x.Order).WithMany().HasForeignKey(x => x.OrderId).OnDelete(DeleteBehavior.Cascade);
 12724                e.HasOne(x => x.TargetAppRole).WithMany().HasForeignKey(x => x.TargetAppRoleId)
 12725                    .OnDelete(DeleteBehavior.Restrict);
 24726            });
 12727            modelBuilder.Entity<OrderControlTaskEvent>(e =>
 12728            {
 12729                e.HasIndex(x => new { x.TaskId, x.CreatedAtUtc });
 12730                e.HasOne(x => x.Task).WithMany().HasForeignKey(x => x.TaskId).OnDelete(DeleteBehavior.Cascade);
 24731            });
 12732            modelBuilder.Entity<OrderControlExecution>().HasIndex(x => x.StartedAtUtc);
 733
 734            // Transaction time tracking
 12735            modelBuilder.Entity<TransactionTimeTrackingSession>()
 12736                .HasIndex(x => x.TrackingKey)
 12737                .IsUnique();
 12738            modelBuilder.Entity<TransactionTimeTrackingSession>()
 12739                .HasIndex(x => new { x.UserName, x.StartedAtUtc });
 12740            modelBuilder.Entity<TransactionTimeTrackingSession>()
 12741                .HasIndex(x => new { x.TransactionType, x.StartedAtUtc });
 12742            modelBuilder.Entity<TransactionTimeTrackingSession>()
 12743                .HasIndex(x => new { x.IsCompleted, x.IsAbandoned, x.StartedAtUtc });
 744
 12745            modelBuilder.Entity<TransactionTimeTrackingResult>()
 12746                .HasIndex(x => x.TrackingKey)
 12747                .IsUnique();
 12748            modelBuilder.Entity<TransactionTimeTrackingResult>()
 12749                .HasIndex(x => new { x.UserName, x.CompletedAtUtc });
 12750            modelBuilder.Entity<TransactionTimeTrackingResult>()
 12751                .HasIndex(x => new { x.TransactionType, x.CompletedAtUtc });
 12752            modelBuilder.Entity<TransactionTimeTrackingResult>()
 12753                .HasIndex(x => x.TransactionId);
 12754            modelBuilder.Entity<TransactionTimeTrackingResult>()
 12755                .HasOne(x => x.TrackingSession)
 12756                .WithMany()
 12757                .HasForeignKey(x => x.TrackingSessionId)
 12758                .OnDelete(DeleteBehavior.SetNull);
 759
 12760            ConfigureAuthorizationModel(modelBuilder);
 761
 762            // ВАЖНО: фильтрация по DataScope-ам намеренно НЕ применяется как глобальный HasQueryFilter.
 763            // По продуктовому требованию каждый контроллер обязан явно применять scope через
 764            // Services.Authorization.Services.IDataScopeService — тогда логика RLS видна в коде контроллеров
 765            // и не «прячется» за моделью EF.
 766
 767            // Выравнивание описывает схему MariaDB и оперирует её же особенностями —
 768            // в частности, одноимёнными индексами на разных таблицах (idx_execution,
 769            // idx_status). SQLite, на котором работают тесты, требует уникальных имён
 770            // индексов в пределах базы, поэтому применяем только к MySQL/MariaDB.
 12771            if (IsMySqlProvider(Database.ProviderName))
 772            {
 3773                ProdSchemaAlignment.Apply(modelBuilder);
 774            }
 12775        }
 776
 777        /// <summary>
 778        /// Конфигурация сущностей новой системы авторизации (RBAC + RLS).
 779        /// </summary>
 780        private static void ConfigureAuthorizationModel(ModelBuilder modelBuilder)
 781        {
 12782            modelBuilder.Entity<AppPage>(e =>
 12783            {
 12784                e.ToTable("AppPages");
 12785                e.HasIndex(p => p.Code).IsUnique();
 12786                e.HasIndex(p => new { p.Area, p.Controller, p.Action });
 12787                e.HasOne(p => p.Parent)
 12788                    .WithMany(p => p.Children)
 12789                    .HasForeignKey(p => p.ParentId)
 12790                    .OnDelete(DeleteBehavior.Restrict);
 24791            });
 792
 12793            modelBuilder.Entity<AppField>(e =>
 12794            {
 12795                e.ToTable("AppFields");
 12796                e.HasIndex(f => new { f.EntityName, f.FieldName, f.FieldType }).IsUnique();
 12797                e.HasOne(f => f.Page)
 12798                    .WithMany(p => p.Fields)
 12799                    .HasForeignKey(f => f.PageId)
 12800                    .OnDelete(DeleteBehavior.SetNull);
 24801            });
 802
 12803            modelBuilder.Entity<DataScope>(e =>
 12804            {
 12805                e.ToTable("DataScopes");
 12806                e.HasIndex(s => s.Code).IsUnique();
 12807                e.HasIndex(s => s.EntityName);
 12808                e.Property(s => s.FilterExpression).HasColumnType("text");
 24809            });
 810
 12811            modelBuilder.Entity<AppRole>(e =>
 12812            {
 12813                e.ToTable("AppRoles");
 12814                e.HasIndex(r => r.Name).IsUnique();
 24815            });
 816
 12817            modelBuilder.Entity<RolePagePermission>(e =>
 12818            {
 12819                e.ToTable("RolePagePermissions");
 12820                e.HasIndex(p => new { p.AppRoleId, p.AppPageId }).IsUnique();
 12821                e.HasOne(p => p.AppRole)
 12822                    .WithMany(r => r.PagePermissions)
 12823                    .HasForeignKey(p => p.AppRoleId)
 12824                    .OnDelete(DeleteBehavior.Cascade);
 12825                e.HasOne(p => p.AppPage)
 12826                    .WithMany(pg => pg.RolePermissions)
 12827                    .HasForeignKey(p => p.AppPageId)
 12828                    .OnDelete(DeleteBehavior.Cascade);
 24829            });
 830
 12831            modelBuilder.Entity<RoleFieldPermission>(e =>
 12832            {
 12833                e.ToTable("RoleFieldPermissions");
 12834                e.HasIndex(p => new { p.AppRoleId, p.AppFieldId }).IsUnique();
 12835                e.HasOne(p => p.AppRole)
 12836                    .WithMany(r => r.FieldPermissions)
 12837                    .HasForeignKey(p => p.AppRoleId)
 12838                    .OnDelete(DeleteBehavior.Cascade);
 12839                e.HasOne(p => p.AppField)
 12840                    .WithMany(f => f.RolePermissions)
 12841                    .HasForeignKey(p => p.AppFieldId)
 12842                    .OnDelete(DeleteBehavior.Cascade);
 24843            });
 844
 12845            modelBuilder.Entity<RoleDataScope>(e =>
 12846            {
 12847                e.ToTable("RoleDataScopes");
 12848                e.HasIndex(p => new { p.AppRoleId, p.DataScopeId }).IsUnique();
 12849                e.HasOne(p => p.AppRole)
 12850                    .WithMany(r => r.DataScopes)
 12851                    .HasForeignKey(p => p.AppRoleId)
 12852                    .OnDelete(DeleteBehavior.Cascade);
 12853                e.HasOne(p => p.DataScope)
 12854                    .WithMany(s => s.RoleLinks)
 12855                    .HasForeignKey(p => p.DataScopeId)
 12856                    .OnDelete(DeleteBehavior.Cascade);
 24857            });
 858
 12859            modelBuilder.Entity<UserAppRole>(e =>
 12860            {
 12861                e.ToTable("UserAppRoles");
 12862                e.HasIndex(u => new { u.UserId, u.AppRoleId }).IsUnique();
 12863                e.HasOne(u => u.AppRole)
 12864                    .WithMany(r => r.UserLinks)
 12865                    .HasForeignKey(u => u.AppRoleId)
 12866                    .OnDelete(DeleteBehavior.Cascade);
 24867            });
 868
 12869            modelBuilder.Entity<UserPageOverride>(e =>
 12870            {
 12871                e.ToTable("UserPageOverrides");
 12872                e.HasIndex(o => new { o.UserId, o.AppPageId }).IsUnique();
 12873                e.HasOne(o => o.AppPage)
 12874                    .WithMany(p => p.UserOverrides)
 12875                    .HasForeignKey(o => o.AppPageId)
 12876                    .OnDelete(DeleteBehavior.Cascade);
 24877            });
 878
 12879            modelBuilder.Entity<UserFieldOverride>(e =>
 12880            {
 12881                e.ToTable("UserFieldOverrides");
 12882                e.HasIndex(o => new { o.UserId, o.AppFieldId }).IsUnique();
 12883                e.HasOne(o => o.AppField)
 12884                    .WithMany(f => f.UserOverrides)
 12885                    .HasForeignKey(o => o.AppFieldId)
 12886                    .OnDelete(DeleteBehavior.Cascade);
 24887            });
 888
 12889            modelBuilder.Entity<UserDataScope>(e =>
 12890            {
 12891                e.ToTable("UserDataScopes");
 12892                e.HasIndex(o => new { o.UserId, o.DataScopeId }).IsUnique();
 12893                e.HasOne(o => o.DataScope)
 12894                    .WithMany(d => d.UserLinks)
 12895                    .HasForeignKey(o => o.DataScopeId)
 12896                    .OnDelete(DeleteBehavior.Cascade);
 24897            });
 898
 12899            modelBuilder.Entity<AuditLogEntry>(e =>
 12900            {
 12901                e.ToTable("AuthAuditLog");
 12902                e.HasIndex(a => a.Timestamp);
 12903                e.HasIndex(a => a.ActorUserId);
 12904                e.HasIndex(a => new { a.EntityType, a.EntityId });
 12905                e.Property(a => a.OldValue).HasColumnType("text");
 12906                e.Property(a => a.NewValue).HasColumnType("text");
 24907            });
 908
 12909            modelBuilder.Entity<ArmtekCartItem>(e =>
 12910            {
 12911                e.HasIndex(x => new { x.ProviderKey, x.ActiveStudioOrderId }).IsUnique();
 12912                e.HasIndex(x => new { x.ProviderKey, x.StudioOrderId, x.Status });
 12913                e.HasIndex(x => new { x.ProviderKey, x.CreatedAtUtc });
 12914                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12915                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 12916                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24917            });
 12918            modelBuilder.Entity<ArmtekOrder>(e =>
 12919            {
 12920                e.HasIndex(x => new { x.ProviderKey, x.Vbeln }).IsUnique();
 24921            });
 12922            modelBuilder.Entity<ArmtekOrderItem>(e =>
 12923            {
 12924                e.HasIndex(x => x.ArmtekOrderId);
 12925                e.HasOne(x => x.ArmtekOrder).WithMany(x => x.Items).HasForeignKey(x => x.ArmtekOrderId).OnDelete(DeleteB
 12926                e.HasOne(x => x.ArmtekCartItem).WithMany().HasForeignKey(x => x.ArmtekCartItemId).OnDelete(DeleteBehavio
 12927                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12928                e.Property(x => x.Price).HasPrecision(18, 4);
 12929                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24930            });
 12931            modelBuilder.Entity<ForumAutoCartItem>(e =>
 12932            {
 12933                e.HasIndex(x => new { x.ProviderKey, x.ActiveStudioOrderId }).IsUnique();
 12934                e.HasIndex(x => new { x.ProviderKey, x.StudioOrderId, x.Status });
 12935                e.HasIndex(x => new { x.ProviderKey, x.CreatedAtUtc });
 12936                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12937                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 12938                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24939            });
 12940            modelBuilder.Entity<ForumAutoOrder>(e =>
 12941            {
 12942                e.HasIndex(x => new { x.ProviderKey, x.Did }).IsUnique();
 12943                e.HasIndex(x => new { x.ProviderKey, x.Eoid });
 24944            });
 12945            modelBuilder.Entity<ForumAutoOrderItem>(e =>
 12946            {
 12947                e.HasIndex(x => x.ForumAutoOrderId);
 12948                e.HasOne(x => x.ForumAutoOrder).WithMany(x => x.Items).HasForeignKey(x => x.ForumAutoOrderId).OnDelete(D
 12949                e.HasOne(x => x.ForumAutoCartItem).WithMany().HasForeignKey(x => x.ForumAutoCartItemId).OnDelete(DeleteB
 12950                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12951                e.Property(x => x.Price).HasPrecision(18, 4);
 12952                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24953            });
 12954            modelBuilder.Entity<FavoritPartsCartItem>(e =>
 12955            {
 12956                e.HasIndex(x => new { x.ProviderKey, x.ActiveStudioOrderId }).IsUnique();
 12957                e.HasIndex(x => new { x.ProviderKey, x.StudioOrderId, x.Status });
 12958                e.HasIndex(x => new { x.ProviderKey, x.CreatedAtUtc });
 12959                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12960                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 12961                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24962            });
 12963            modelBuilder.Entity<FavoritPartsOrder>(e =>
 12964            {
 12965                e.HasIndex(x => new { x.ProviderKey, x.ExternalOrderId }).IsUnique();
 24966            });
 12967            modelBuilder.Entity<FavoritPartsOrderItem>(e =>
 12968            {
 12969                e.HasIndex(x => x.FavoritPartsOrderId);
 12970                e.HasOne(x => x.FavoritPartsOrder).WithMany(x => x.Items).HasForeignKey(x => x.FavoritPartsOrderId).OnDe
 12971                e.HasOne(x => x.FavoritPartsCartItem).WithMany().HasForeignKey(x => x.FavoritPartsCartItemId).OnDelete(D
 12972                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12973                e.Property(x => x.Price).HasPrecision(18, 4);
 12974                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24975            });
 12976            modelBuilder.Entity<ProfitLigaCartItem>(e =>
 12977            {
 12978                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 12979                e.HasIndex(x => new { x.StudioOrderId, x.Status });
 12980                e.HasIndex(x => x.CreatedAtUtc);
 12981                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 12982                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 12983                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24984            });
 12985            modelBuilder.Entity<ProfitLigaOrder>(e =>
 12986            {
 12987                e.HasIndex(x => x.OrderNumber).IsUnique();
 24988            });
 12989            modelBuilder.Entity<ProfitLigaOrderItem>(e =>
 12990            {
 12991                e.HasIndex(x => x.ProfitLigaOrderId);
 12992                e.HasOne(x => x.ProfitLigaOrder).WithMany(x => x.Items).HasForeignKey(x => x.ProfitLigaOrderId).OnDelete
 12993                e.HasOne(x => x.ProfitLigaCartItem).WithMany().HasForeignKey(x => x.ProfitLigaCartItemId).OnDelete(Delet
 12994                e.HasOne<Order>().WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Restrict);
 12995                e.Property(x => x.Price).HasPrecision(18, 4);
 12996                e.Property(x => x.Quantity).HasPrecision(18, 3);
 24997            });
 12998            modelBuilder.Entity<NikeiCartItem>(e =>
 12999            {
 121000                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121001                e.HasIndex(x => new { x.StudioOrderId, x.Status });
 121002                e.HasIndex(x => x.ExternalOrderNumber);
 121003                e.HasIndex(x => x.CreatedAtUtc);
 121004                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121005                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 241006            });
 121007            modelBuilder.Entity<ProfitLigaPointMapping>(e =>
 121008            {
 121009                e.HasIndex(x => x.ShipmentWarehouseId).IsUnique();
 121010                e.HasOne(x => x.ShipmentWarehouse).WithMany().HasForeignKey(x => x.ShipmentWarehouseId)
 121011                    .OnDelete(DeleteBehavior.Restrict);
 241012            });
 121013            modelBuilder.Entity<BergCartItem>(e =>
 121014            {
 121015                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121016                e.HasIndex(x => new { x.StudioOrderId, x.Status });
 121017                e.HasIndex(x => x.CreatedAtUtc);
 121018                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121019                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 121020                e.Property(x => x.MaxPrice).HasPrecision(18, 4);
 121021                e.Property(x => x.Quantity).HasPrecision(18, 3);
 241022            });
 121023            modelBuilder.Entity<BergOrder>(e =>
 121024            {
 121025                e.HasIndex(x => x.ExternalOrderId).IsUnique();
 121026                e.HasIndex(x => x.Reference).IsUnique();
 241027            });
 121028            modelBuilder.Entity<BergOrderItem>(e =>
 121029            {
 121030                e.HasIndex(x => x.BergOrderId);
 121031                e.HasOne(x => x.BergOrder).WithMany(x => x.Items).HasForeignKey(x => x.BergOrderId).OnDelete(DeleteBehav
 121032                e.HasOne<BergCartItem>().WithMany().HasForeignKey(x => x.BergCartItemId).OnDelete(DeleteBehavior.SetNull
 121033                e.HasOne<Order>().WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Restrict);
 121034                e.Property(x => x.Price).HasPrecision(18, 4);
 121035                e.Property(x => x.Quantity).HasPrecision(18, 3);
 241036            });
 121037            modelBuilder.Entity<BergDeliveryAddressMapping>(e =>
 121038            {
 121039                e.HasIndex(x => x.ShipmentWarehouseId).IsUnique();
 121040                e.HasOne(x => x.ShipmentWarehouse).WithMany().HasForeignKey(x => x.ShipmentWarehouseId)
 121041                    .OnDelete(DeleteBehavior.Restrict);
 241042            });
 121043            modelBuilder.Entity<MikadoCartItem>(e =>
 121044            {
 121045                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121046                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121047                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 241048            });
 121049            modelBuilder.Entity<ZZapCartItem>(e =>
 121050            {
 121051                e.HasIndex(x => new { x.ProviderKey, x.ActiveStudioOrderId }).IsUnique();
 121052                e.HasIndex(x => new { x.ProviderKey, x.CodeOrder });
 121053                e.HasIndex(x => new { x.StudioOrderId, x.Status });
 121054                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121055                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 121056                e.Property(x => x.MinSumOrder).HasPrecision(18, 4);
 241057            });
 121058            modelBuilder.Entity<MoskvorechieIstraCartItem>(e =>
 121059            {
 121060                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121061                e.HasIndex(x => new { x.ExternalBasketItemId, x.Status });
 121062                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121063                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121064                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 241065            });
 121066            modelBuilder.Entity<MoskvorechieIstraOrder>(e =>
 121067            {
 121068                e.HasIndex(x => x.ExternalOrderNumber).IsUnique();
 241069            });
 121070            modelBuilder.Entity<MoskvorechieIstraOrderItem>(e =>
 121071            {
 121072                e.HasIndex(x => new { x.MoskvorechieIstraOrderId, x.StudioOrderId, x.Article }).IsUnique();
 121073                e.HasOne(x => x.MoskvorechieIstraOrder).WithMany(x => x.Items).HasForeignKey(x => x.MoskvorechieIstraOrd
 121074                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121075                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121076                e.Property(x => x.Price).HasPrecision(18, 2);
 241077            });
 121078            modelBuilder.Entity<MotexCartItem>(e =>
 121079            {
 121080                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121081                e.HasIndex(x => new { x.StudioOrderId, x.Status });
 121082                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121083                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121084                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 241085            });
 241086            modelBuilder.Entity<MotexOrder>(e => e.HasIndex(x => x.ClientOrderNum).IsUnique());
 121087            modelBuilder.Entity<MotexOrderItem>(e =>
 121088            {
 121089                e.HasIndex(x => new { x.MotexOrderId, x.StudioOrderId, x.Code }).IsUnique();
 121090                e.HasOne(x => x.MotexOrder).WithMany(x => x.Items).HasForeignKey(x => x.MotexOrderId).OnDelete(DeleteBeh
 121091                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121092                e.Property(x => x.Price).HasPrecision(18, 4);
 241093            });
 121094            modelBuilder.Entity<ShateMCartItem>(e =>
 121095            {
 121096                e.HasIndex(x => x.ActiveStudioOrderId).IsUnique();
 121097                e.HasIndex(x => new { x.ExternalBasketItemId, x.Status });
 121098                e.HasOne(x => x.StudioOrder).WithMany().HasForeignKey(x => x.StudioOrderId).OnDelete(DeleteBehavior.Rest
 121099                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121100                e.Property(x => x.SourcePrice).HasPrecision(18, 4);
 241101            });
 241102            modelBuilder.Entity<ShateMOrder>(e => e.HasIndex(x => x.ExternalOrderId).IsUnique());
 121103            modelBuilder.Entity<ShateMOrderItem>(e =>
 121104            {
 121105                e.HasIndex(x => new { x.ShateMOrderId, x.StudioOrderId, x.PriceId }).IsUnique();
 121106                e.HasOne(x => x.ShateMOrder).WithMany(x => x.Items).HasForeignKey(x => x.ShateMOrderId).OnDelete(DeleteB
 121107                e.Property(x => x.Quantity).HasPrecision(18, 3);
 121108                e.Property(x => x.Price).HasPrecision(18, 4);
 241109            });
 1110
 121111            modelBuilder.Entity<SupplierStatus>(e =>
 121112            {
 121113                e.HasIndex(x => new { x.ProviderKey, x.StatusKind, x.Name }).IsUnique();
 121114                e.HasIndex(x => new { x.ProviderKey, x.StatusKind, x.ExternalCode });
 121115                e.HasOne(x => x.Supplier).WithMany().HasForeignKey(x => x.SupplierId).OnDelete(DeleteBehavior.SetNull);
 121116                e.HasOne(x => x.StatusColor).WithMany().HasForeignKey(x => x.StatusColorId).OnDelete(DeleteBehavior.SetN
 241117            });
 1118
 121119            modelBuilder.Entity<OrderSupplierState>(e =>
 121120            {
 121121                // Одна активная строка на (поставщик, заказ). Закрытые строки обнуляют ActiveOrderId
 121122                // и выходят из-под индекса, сохраняясь для истории — приём тот же, что в ArmtekCartItems.
 121123                e.HasIndex(x => new { x.ProviderKey, x.ActiveOrderId }).IsUnique();
 121124                e.HasIndex(x => x.OrderId);
 121125                e.HasIndex(x => new { x.ProviderKey, x.Stage, x.LastSyncedAt });
 121126                e.HasIndex(x => x.ExternalOrderNumber);
 121127                e.HasOne(x => x.Order).WithMany().HasForeignKey(x => x.OrderId).OnDelete(DeleteBehavior.Restrict);
 121128                e.HasOne(x => x.SupplierStatus).WithMany().HasForeignKey(x => x.SupplierStatusId).OnDelete(DeleteBehavio
 121129                e.Property(x => x.QuantityOrdered).HasPrecision(18, 3);
 121130                e.Property(x => x.QuantityConfirmed).HasPrecision(18, 3);
 121131                e.Property(x => x.QuantityShipped).HasPrecision(18, 3);
 121132                e.Property(x => x.QuantityRejected).HasPrecision(18, 3);
 241133            });
 1134
 121135            modelBuilder.Entity<SupplierOrderIntent>(e =>
 121136            {
 121137                // Одно активное намерение на (поставщик, заказ): завершённые строки обнуляют ActiveStudioOrderId
 121138                // и выходят из-под индекса, сохраняясь для истории. Нарушение индекса = второй запрос обогнал первый.
 121139                e.HasIndex(x => new { x.ProviderKey, x.ActiveStudioOrderId }).IsUnique();
 121140                e.HasIndex(x => x.StudioOrderId);
 121141                e.HasIndex(x => new { x.Status, x.UpdatedAtUtc });
 241142            });
 1143
 121144            modelBuilder.Entity<OrderSupplierStateHistory>(e =>
 121145            {
 121146                e.HasIndex(x => new { x.OrderId, x.PerformedAt });
 121147                e.HasIndex(x => x.OrderHistoryId);
 121148                e.HasOne(x => x.OrderSupplierState).WithMany().HasForeignKey(x => x.OrderSupplierStateId).OnDelete(Delet
 121149                e.HasOne(x => x.OrderHistory).WithMany().HasForeignKey(x => x.OrderHistoryId).OnDelete(DeleteBehavior.Se
 241150            });
 1151
 121152        }
 1153
 1154        /// <summary>
 1155        /// Провайдер MySQL/MariaDB. В тестах контекст поднимается на SQLite или
 1156        /// in-memory, и подгонка под боевую схему там не применяется.
 1157        /// </summary>
 1158        internal static bool IsMySqlProvider(string? providerName) =>
 131159            providerName?.Contains("MySql", StringComparison.OrdinalIgnoreCase) == true;
 1160
 1161    }
 1162}

Methods/Properties

get_Orders()
get_Products()
get_Currencys()
get_Warehouses()
get_AppStatuses()
get_ClientStatuses()
get_Suppliers()
get_ApiSupplierSettings()
get_ApiSupplierRequestAuditEntries()
get_SupplierQuotationRequests()
get_SupplierQuotationOffers()
get_ArmtekDeliveryAddressMappings()
get_ApiSupplierWarehouses()
get_ArmtekSettlements()
get_ArmtekInvoices()
get_ArmtekInvoiceItems()
get_ArmtekEtpSyncRuns()
get_FidSupplierLinks()
get_FidSupplierLinkSettings()
get_Transactions()
get_OzonClients()
get_AccessProfiles()
get_DataScopeSets()
get_DataScopeSetItems()
get_ColumnMappings()
get_Manufacturers()
get_OrdersFileMetadata()
get_MatchedRows()
get_MatchedResults()
get_MatchingColumns()
get_SavedMatchingColumns()
get_FileUploadRecords()
get_OrderCarts()
get_OrderItems()
get_CartStatuses()
get_ItemStatuses()
get_StatusColors()
get_ExcludedArticles()
get_ExcelMappings()
get_PriceHistories()
get_OrderHistories()
get_WarehouseMappings()
get_Deliveries()
get_DeliveryProviders()
get_ExcludedBitrixWarehouses()
get_EtProducers()
get_OrderArchives()
get_OrderPrices()
get_OrderOzonPromotionSnapshots()
get_OrderOzonPromotionConditions()
get_PriceIndexes()
get_OrderExtensions()
get_BitrixStockSavedFilters()
get_ExpenseTypes()
get_OrderExtraExpenses()
get_OrdersGridUserSettings()
get_UserSidebarSettings()
get_StatusTransitions()
get_StatusTransitionHistory()
get_TransactionTypeSettings()
get_Shipments()
get_OzonChatOrders()
get_OzonChatResponseStatistics()
get_OzonChatResponseTimes()
get_OrderReturns()
get_OrderReturnSyncRuns()
get_OzonHandoverImportBatches()
get_OzonHandoverActs()
get_OzonHandoverActItems()
get_OzonHandoverActItemPhotos()
get_OrderShipmentTotals()
get_OrderCalculationSnapshots()
get_OrderHistoryOneCPostings()
get_OrderHistoryOneCPostingLinks()
get_OneCNomenclatureMaps()
get_OneCProducerAliases()
get_InterpartsWarehouseLogins()
get_InterpartsSutCurrencies()
get_OzonPushNotifications()
get_OzonPostingCancellations()
get_OzonPostingCancellationOrders()
get_EmailRoutingRules()
get_EmailMessageInboxes()
get_EmailAttachmentInboxes()
get_EmailAttachmentProcessingResults()
get_EmailRoutingJobExecutions()
get_TransactionTimeTrackingSessions()
get_TransactionTimeTrackingResults()
get_WarehouseStockSnapshots()
get_WarehouseStockSyncRuns()
get_BackgroundJobSchedules()
get_BackgroundJobExecutions()
get_BackgroundJobSteps()
get_BackgroundReportLoads()
get_BackgroundOrderMatches()
get_BackgroundTransactionResults()
get_OrderSearchSyncStates()
get_OrderControlRules()
get_OrderControlTasks()
get_OrderControlTaskEvents()
get_OrderControlSettings()
get_OrderControlExecutions()
get_SystemAlertIncidents()
get_SystemMonitoringSignals()
get_ArmtekCartItems()
get_ArmtekOrders()
get_ArmtekOrderItems()
get_MlAutoCartItems()
get_MlAutoOrders()
get_MlAutoRuCartItems()
get_MlAutoRuOrders()
get_MlAutoOrderItems()
get_MlAutoDeliveryAddressMappings()
get_MlAutoRuDeliveryAddressMappings()
get_ForumAutoCartItems()
get_ForumAutoOrders()
get_ForumAutoOrderItems()
get_FavoritPartsCartItems()
get_FavoritPartsOrders()
get_FavoritPartsOrderItems()
get_ProfitLigaCartItems()
get_ProfitLigaOrders()
get_ProfitLigaOrderItems()
get_ProfitLigaPointMappings()
get_NikeiCartItems()
get_MikadoCartItems()
get_ZZapCartItems()
get_MoskvorechieIstraCartItems()
get_MoskvorechieIstraOrders()
get_MoskvorechieIstraOrderItems()
get_MotexCartItems()
get_MotexOrders()
get_MotexOrderItems()
get_ShateMCartItems()
get_ShateMOrders()
get_ShateMOrderItems()
get_BergCartItems()
get_BergOrders()
get_BergOrderItems()
get_BergDeliveryAddressMappings()
get_SupplierStatuses()
get_OrderSupplierStates()
get_OrderSupplierStateHistory()
get_SupplierOrderIntents()
get_BitrixStockClearExecutions()
get_BitrixStockClearItems()
get_BitrixStockArchiveExecutions()
get_BitrixStockArchiveItems()
get_BitrixStockUnarchiveExecutions()
get_BitrixStockUnarchiveItems()
get_BitrixStockPushExecutions()
get_BitrixStockPushItems()
get_BitrixStockAutoSchedules()
get_BitrixStockAutoScheduleRuns()
get_FidStatSnapshots()
get_FidStatItems()
get_AppPages()
get_AppFields()
get_DataScopes()
get_AppRoles()
get_RolePagePermissions()
get_RoleFieldPermissions()
get_RoleDataScopes()
get_UserAppRoles()
get_UserPageOverrides()
get_UserFieldOverrides()
get_UserDataScopes()
get_AuditLogEntries()
get_LabelPrintLogs()
get_AssemblyListRuns()
get_AssemblyListRunItems()
get_AssemblyListAccessKeys()
get_Partners()
get_PartnerRules()
get_PartnerRuleConditions()
get_PartnerPermissions()
get_PartnerAuditLogs()
get_PartnerLoginCodes()
.ctor()
.ctor(Microsoft.EntityFrameworkCore.DbContextOptions`1<OzonRepositories.Context.ApplicationDbContext>)
ConfigurePartnerOffice(Microsoft.EntityFrameworkCore.ModelBuilder)
OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder)
ConfigureAuthorizationModel(Microsoft.EntityFrameworkCore.ModelBuilder)
IsMySqlProvider(System.String)