{"path":"NexusReader.Data/Persistence/AppDbContext.cs","purpose":"Defines the Entity Framework Core database context for the application: DbSet surface, EF configuration, model mapping (indexes, FKs, delete behavior), provider-specific type mapping, and deterministic seed data for subscription plans.","classification":{"role":"database-config","layer":"data","confidence":0.86,"evidence":["Class inherits IdentityDbContext (line 7)","Exposes DbSet properties for domain entities (lines 20-26)","Implements OnModelCreating with entity mappings and HasData seeding (lines 28-128)"]},"className":"AppDbContext","methods":[{"name":"AppDbContext","line":9,"endLine":11,"signature":"(options: DbContextOptions) -> AppDbContext","purpose":"Constructs the EF DbContext with provided options.","calls":[],"actions":[{"id":"ctor_9","kind":"mapping","label":"Ctor delegates to base DbContext","line":9,"detail":"Invokes base(options) to initialize IdentityDbContext","visibility":"detail-only","confidence":0.7}]},{"name":"OnConfiguring","line":13,"endLine":18,"signature":"(optionsBuilder: DbContextOptionsBuilder) -> void","purpose":"Performs additional EF configuration; suppresses a pending-model-changes warning to avoid runtime exceptions in some environments.","calls":[],"actions":[{"id":"framework-call_15","kind":"mapping","label":"Calls base OnConfiguring","line":15,"detail":"base.OnConfiguring(optionsBuilder)","visibility":"detail-only","confidence":0.7},{"id":"configuration_16","kind":"mapping","label":"Suppress PendingModelChangesWarning","line":16,"detail":"optionsBuilder.ConfigureWarnings(...Ignore(RelationalEventId.PendingModelChangesWarning))","visibility":"detail-only","confidence":0.7}]},{"name":"SemanticKnowledgeCache (DbSet property)","line":20,"endLine":20,"signature":"() -> DbSet","purpose":"Exposes the DbSet for SemanticKnowledgeCache entities.","calls":[],"actions":[{"id":"expose-dbset_20","kind":"mapping","label":"Exposes Set()","line":20,"detail":"public DbSet SemanticKnowledgeCache => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"KnowledgeUnits (DbSet property)","line":21,"endLine":21,"signature":"() -> DbSet","purpose":"Exposes the DbSet for KnowledgeUnit entities.","calls":[],"actions":[{"id":"expose-dbset_21","kind":"mapping","label":"Exposes Set()","line":21,"detail":"public DbSet KnowledgeUnits => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"KnowledgeUnitLinks (DbSet property)","line":22,"endLine":22,"signature":"() -> DbSet","purpose":"Exposes the DbSet for KnowledgeUnitLink entities.","calls":[],"actions":[{"id":"expose-dbset_22","kind":"mapping","label":"Exposes Set()","line":22,"detail":"public DbSet KnowledgeUnitLinks => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"Ebooks (DbSet property)","line":23,"endLine":23,"signature":"() -> DbSet","purpose":"Exposes the DbSet for Ebook entities.","calls":[],"actions":[{"id":"expose-dbset_23","kind":"mapping","label":"Exposes Set()","line":23,"detail":"public DbSet Ebooks => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"QuizResults (DbSet property)","line":24,"endLine":24,"signature":"() -> DbSet","purpose":"Exposes the DbSet for QuizResult entities.","calls":[],"actions":[{"id":"expose-dbset_24","kind":"mapping","label":"Exposes Set()","line":24,"detail":"public DbSet QuizResults => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"SubscriptionPlans (DbSet property)","line":25,"endLine":25,"signature":"() -> DbSet","purpose":"Exposes the DbSet for SubscriptionPlan entities.","calls":[],"actions":[{"id":"expose-dbset_25","kind":"mapping","label":"Exposes Set()","line":25,"detail":"public DbSet SubscriptionPlans => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"Authors (DbSet property)","line":26,"endLine":26,"signature":"() -> DbSet","purpose":"Exposes the DbSet for Author entities.","calls":[],"actions":[{"id":"expose-dbset_26","kind":"mapping","label":"Exposes Set()","line":26,"detail":"public DbSet Authors => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"OnModelCreating","line":28,"endLine":128,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Configures EF model mappings: entity properties, indexes, relationships, provider-specific column types, and seeds subscription plans with deterministic IDs.","calls":[],"actions":[{"id":"framework-call_30","kind":"mapping","label":"Calls base OnModelCreating","line":30,"detail":"base.OnModelCreating(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_32","kind":"mapping","label":"NexusUser property & index mapping","line":32,"detail":"Configures LastReadPageId length, LastReadAt optional, index on TenantId, SubscriptionPlan FK (restrict), default SubscriptionPlanId = 1 (lines 32-46)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_48","kind":"mapping","label":"SubscriptionPlan unique index","line":48,"detail":"Configures unique index on PlanName (line 50)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_53","kind":"mapping","label":"SemanticKnowledgeCache key/index and provider-specific embedding handling","line":53,"detail":"Sets ContentHash as key and unique index, tenant index; IF PostgreSQL then map Embedding column to vector(768) and create hnsw index with vector_cosine_ops; ELSE ignore Embedding property (lines 55-67)","visibility":"detail-only","confidence":0.7},{"id":"onmodelcreating_branch_58_0","kind":"branch","label":"Evaluates branch condition","line":58,"detail":"if (Database.IsNpgsql())","conditionSummary":"Database.IsNpgsql()","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"branch_58","kind":"branch","label":"Provider branch: Database.IsNpgsql()","line":58,"detail":"If Npgsql: configure vector column and HNSW index (lines 60-62); else ignore Embedding (line 66)","conditionSummary":"Database.IsNpgsql()","outcomeLabels":["postgresql-path","other-db-path"],"visibility":"detail-only","confidence":0.7},{"id":"onmodelcreating_fallback_64_1","kind":"fallback","label":"Falls back to alternate path","line":64,"detail":"else","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"entity-configuration_70","kind":"mapping","label":"KnowledgeUnit keys, indexes, relationship to Ebook","line":70,"detail":"Sets key Id, indexes on TenantId and EbookId, FK to Ebook with Cascade delete (lines 72-79)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_82","kind":"mapping","label":"KnowledgeUnitLink relationships","line":82,"detail":"Sets key Id; SourceUnit -> OutgoingLinks FK cascade; TargetUnit -> IncomingLinks FK cascade (lines 84-93)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_96","kind":"mapping","label":"Ebook relationships","line":96,"detail":"FK to User (cascade) and Author (restrict); index TenantId (lines 98-109)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_111","kind":"mapping","label":"QuizResult relationship and index","line":111,"detail":"FK to User (cascade) and index on TenantId (lines 113-118)","visibility":"detail-only","confidence":0.7},{"id":"data-seed_121","kind":"mapping","label":"Seed SubscriptionPlan rows with deterministic IDs","line":121,"detail":"Inserts four SubscriptionPlan rows with Ids 1..4 and preset PlanName/AITokenLimit/MonthlyPrice/StripeProductId (lines 121-127)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AppDbContext","kind":"model","line":7,"purpose":"EF Core DbContext for application persistence, extending IdentityDbContext for user identity and domain entities.","fields":[{"name":"SemanticKnowledgeCache","type":"DbSet","required":true,"line":20,"description":"DbSet exposing cached semantic embeddings"},{"name":"KnowledgeUnits","type":"DbSet","required":true,"line":21,"description":"DbSet for knowledge units extracted from ebooks"},{"name":"KnowledgeUnitLinks","type":"DbSet","required":true,"line":22,"description":"DbSet for directed links between knowledge units"},{"name":"Ebooks","type":"DbSet","required":true,"line":23,"description":"DbSet for ebooks owned by users"},{"name":"QuizResults","type":"DbSet","required":true,"line":24,"description":"DbSet for quiz results per user"},{"name":"SubscriptionPlans","type":"DbSet","required":true,"line":25,"description":"DbSet for subscription plans; also seeded with deterministic IDs"},{"name":"Authors","type":"DbSet","required":true,"line":26,"description":"DbSet for ebook authors"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities (referenced via using NexusReader.Domain.Entities at line 3)","Microsoft.EntityFrameworkCore (EF Core usage evident)"],"patterns":["EF DbContext","Fluent API model configuration","Provider-specific configuration","Deterministic data seeding"],"domainConcepts":["NexusUser","SemanticKnowledgeCache","KnowledgeUnit","KnowledgeUnitLink","Ebook","QuizResult","SubscriptionPlan","Author"],"keyDetails":"Important runtime behaviors: suppresses PendingModelChangesWarning (OnConfiguring), conditional provider-specific mapping for vector embeddings and HNSW index when PostgreSQL is used (lines 58-63), and seeds SubscriptionPlan rows with fixed IDs (lines 121-127) to ensure deterministic plan IDs.","orchestrationMethods":[{"name":"OnModelCreating","line":28,"confidence":0.81,"reason":"Contains 3 architectural actions relevant to business execution.","actionKinds":["mapping","branch","fallback"],"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs"]}],"typedContracts":[{"name":"AppDbContext","kind":"model","line":7,"fieldCount":7,"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"OnModelCreating","line":28,"summary":"Contains 3 architectural actions relevant to business execution.","confidence":0.81,"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs"]},{"kind":"typed-contract","label":"AppDbContext","line":7,"summary":"model with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ca736482d99ebf647ea5ec5334c2963c235d1f1818cf40c6c5974dbfea257ebc","sourceByteSize":5514,"analyzedAt":"2026-05-23T16:25:35.366Z","technology":"dotnet"}}