using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; using TeleWave.Application.Common.Interfaces; using TeleWave.Domain.Auth; using TeleWave.Domain.Broadcast; using TeleWave.Domain.Images; using TeleWave.Domain.Library; using TeleWave.Domain.Media; using TeleWave.Domain.Settings; using TeleWave.Infrastructure.Identity; namespace TeleWave.Infrastructure.Persistence; /// /// Корневой DbContext приложения: Identity-схема (пользователи/роли) + сущности домена /// (добавляются по мере реализации фич). /// public class AppDbContext(DbContextOptions options) : IdentityDbContext(options), IAppDbContext { public DbSet RefreshTokens => Set(); public DbSet MediaAssets => Set(); public DbSet Shows => Set(); public DbSet Channels => Set(); public DbSet ScheduleEntries => Set(); public DbSet BumperTextVariants => Set(); public DbSet BumperAssets => Set(); public DbSet AppSettings => Set(); public DbSet Images => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); // Guid-ключи доменных сущностей мы задаём сами в фабриках. Без этого EF считает выставленный // ключ признаком уже существующей строки и при добавлении дочерней сущности через коллекцию // отслеживаемого родителя (напр. show.AddEpisode) делает UPDATE вместо INSERT → «affected 0». foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { if ( entityType.ClrType.Namespace?.StartsWith( "TeleWave.Domain", StringComparison.Ordinal ) != true ) continue; var idProperty = entityType.FindProperty("Id"); if (idProperty is not null && idProperty.ClrType == typeof(Guid)) idProperty.ValueGenerated = ValueGenerated.Never; } } }