1 line
10 KiB
JSON
1 line
10 KiB
JSON
{"path":"NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs","purpose":"EF Core model snapshot that records the database model (entities, properties, indexes, relationships, and seed data) for AppDbContext so migrations can compare model changes at runtime.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class derives from ModelSnapshot (line 15)","DbContext attribute references AppDbContext (line 14)","Extensive modelBuilder.Entity(...) configuration and HasData seed (multiple lines)"]},"className":"AppDbContextModelSnapshot","methods":[{"name":"BuildModel","line":17,"endLine":709,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Populates the provided ModelBuilder with the full EF Core model: annotations, extensions, entity/property definitions, indexes, relationships, navigations, and seed data used by migrations.","calls":[],"actions":[{"id":"annotation_20","kind":"mapping","label":"Set product version and max identifier length","line":20,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension_24","kind":"mapping","label":"Enable Postgres vector extension","line":24,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"configuration_25","kind":"mapping","label":"Use identity-by-default columns globally for Npgsql","line":25,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-config_27","kind":"mapping","label":"Configure IdentityRole (AspNetRoles)","line":27,"detail":"Defines properties Id, ConcurrencyStamp, Name, NormalizedName; key and unique index NormalizedName; map to AspNetRoles","visibility":"detail-only","confidence":0.7},{"id":"entity-config_53","kind":"mapping","label":"Configure IdentityRoleClaim (AspNetRoleClaims)","line":53,"detail":"Defines auto-generated integer Id, ClaimType, ClaimValue, RoleId FK, index on RoleId","visibility":"detail-only","confidence":0.7},{"id":"entity-config_78","kind":"mapping","label":"Configure IdentityUserClaim (AspNetUserClaims)","line":78,"detail":"Defines auto-generated integer Id, ClaimType, ClaimValue, UserId FK, index on UserId","visibility":"detail-only","confidence":0.7},{"id":"entity-config_103","kind":"mapping","label":"Configure IdentityUserLogin (AspNetUserLogins)","line":103,"detail":"Composite key (LoginProvider, ProviderKey), ProviderDisplayName, UserId FK, index on UserId","visibility":"detail-only","confidence":0.7},{"id":"entity-config_125","kind":"mapping","label":"Configure IdentityUserRole (AspNetUserRoles)","line":125,"detail":"Composite key (UserId, RoleId), indexes and mapping to AspNetUserRoles","visibility":"detail-only","confidence":0.7},{"id":"entity-config_140","kind":"mapping","label":"Configure IdentityUserToken (AspNetUserTokens)","line":140,"detail":"Composite key (UserId, LoginProvider, Name), Value property","visibility":"detail-only","confidence":0.7},{"id":"entity-config_159","kind":"mapping","label":"Configure Author entity","line":159,"detail":"Id (int, identity), Name (required, max 255), maps to Authors","visibility":"detail-only","confidence":0.7},{"id":"entity-config_177","kind":"mapping","label":"Configure Ebook entity","line":177,"detail":"Id (Guid), AddedDate, AuthorId FK, FilePath required, Title required, TenantId required, indexes on AuthorId/TenantId/UserId, maps to Ebooks","visibility":"detail-only","confidence":0.7},{"id":"entity-config_240","kind":"mapping","label":"Configure KnowledgeUnit entity","line":240,"detail":"Id (string max128), Content required, CreatedAt, EbookId (nullable FK), Vector (vector(768)), Version required, indexes on EbookId/TenantId, maps to KnowledgeUnits","visibility":"detail-only","confidence":0.7},{"id":"entity-config_284","kind":"mapping","label":"Configure KnowledgeUnitLink entity","line":284,"detail":"Id (int identity), RelationType, SourceUnitId, TargetUnitId (strings max128), indexes on SourceUnitId/TargetUnitId, maps to KnowledgeUnitLinks","visibility":"detail-only","confidence":0.7},{"id":"entity-config_316","kind":"mapping","label":"Configure NexusUser (AspNetUsers) entity","line":316,"detail":"Many identity and profile fields, SubscriptionPlanId with default 1, TenantId required, indexes on NormalizedEmail/NormalizedUserName/SubscriptionPlanId/TenantId, maps to AspNetUsers","visibility":"detail-only","confidence":0.7},{"id":"entity-config_414","kind":"mapping","label":"Configure QuizResult entity","line":414,"detail":"Id (Guid), CompletedDate, Score, Topic required, TenantId/UserId required, indexes on TenantId/UserId, maps to QuizResults","visibility":"detail-only","confidence":0.7},{"id":"entity-config_451","kind":"mapping","label":"Configure SemanticKnowledgeCache entity","line":451,"detail":"ContentHash primary key (max128), CreatedAt, JsonData, ModelId, OriginalText, PromptVersion, TenantId, Vector (vector(1536)), unique index on ContentHash, maps to SemanticKnowledgeCache","visibility":"detail-only","confidence":0.7},{"id":"entity-config_496","kind":"mapping","label":"Configure SubscriptionPlan entity and seed data","line":496,"detail":"Id (int identity), AITokenLimit, IsUnlimitedTokens, MonthlyPrice, PlanName(unique), StripeProductId; seed data inserts 4 plans (Free, Basic, Pro, Enterprise) lines 530-566","visibility":"detail-only","confidence":0.7},{"id":"seed_530","kind":"mapping","label":"Seed SubscriptionPlan rows","line":530,"detail":"HasData inserts 4 hard-coded SubscriptionPlan entries (Id 1..4) with AITokenLimit, MonthlyPrice, PlanName, StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"relationship_569","kind":"mapping","label":"Identity RoleClaim -> IdentityRole FK","line":569,"detail":"RoleClaim.HasOne(Role).WithMany().HasForeignKey(RoleId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7},{"id":"relationship_578","kind":"mapping","label":"UserClaim -> NexusUser FK","line":578,"detail":"UserClaim.HasOne(NexusUser).WithMany().HasForeignKey(UserId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7},{"id":"relationship_587","kind":"mapping","label":"UserLogin -> NexusUser FK","line":587,"detail":"UserLogin.HasOne(NexusUser).WithMany().HasForeignKey(UserId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7},{"id":"relationship_596","kind":"mapping","label":"UserRole -> Role and NexusUser FKs","line":596,"detail":"UserRole.HasOne(Role).HasForeignKey(RoleId) and HasOne(NexusUser).HasForeignKey(UserId), both Cascade","visibility":"detail-only","confidence":0.7},{"id":"relationship_611","kind":"mapping","label":"UserToken -> NexusUser FK","line":611,"detail":"UserToken.HasOne(NexusUser).WithMany().HasForeignKey(UserId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7},{"id":"relationship_620","kind":"mapping","label":"Ebook -> Author and NexusUser FKs","line":620,"detail":"Ebook.HasOne(Author).WithMany(Ebooks).HasForeignKey(AuthorId).OnDelete(Restrict); Ebook.HasOne(User).WithMany(Ebooks).HasForeignKey(UserId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7},{"id":"navigation_634","kind":"mapping","label":"Entity navigations registered","line":634,"detail":"Multiple b.Navigation(...) calls register navigation properties for entities (Author.Ebooks, Ebook.Author/User, KnowledgeUnit.IncomingLinks/OutgoingLinks, NexusUser.Ebooks/QuizResults etc.)","visibility":"detail-only","confidence":0.7},{"id":"relationship_639","kind":"mapping","label":"KnowledgeUnit -> Ebook FK","line":639,"detail":"KnowledgeUnit.HasOne(Ebook).WithMany().HasForeignKey(EbookId).OnDelete(Cascade) (EbookId nullable)","visibility":"detail-only","confidence":0.7},{"id":"relationship_649","kind":"mapping","label":"KnowledgeUnitLink -> Source/Target KnowledgeUnit FKs","line":649,"detail":"SourceUnit and TargetUnit relationships, both Cascade and required","visibility":"detail-only","confidence":0.7},{"id":"relationship_668","kind":"mapping","label":"NexusUser -> SubscriptionPlan FK","line":668,"detail":"NexusUser.HasOne(SubscriptionPlan).WithMany().HasForeignKey(SubscriptionPlanId).OnDelete(Restrict)","visibility":"detail-only","confidence":0.7},{"id":"relationship_679","kind":"mapping","label":"QuizResult -> NexusUser FK","line":679,"detail":"QuizResult.HasOne(User).WithMany(QuizResults).HasForeignKey(UserId).OnDelete(Cascade)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AppDbContextModelSnapshot","kind":"model","line":15,"purpose":"Generated EF Core ModelSnapshot class that captures the compiled model for AppDbContext used by the migrations system.","fields":[{"name":"BuildModel","type":"method","required":true,"line":17,"description":"Method that constructs the model via ModelBuilder"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/Author.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnit.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs","NexusReader.Domain/Entities/NexusUser.cs","NexusReader.Domain/Entities/QuizResult.cs","NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","NexusReader.Domain/Entities/SubscriptionPlan.cs"],"patterns":["EF Core Migrations","Model Snapshot","Code-first DB schema"],"domainConcepts":["Author","Ebook","KnowledgeUnit","KnowledgeUnitLink","NexusUser","QuizResult","SemanticKnowledgeCache","SubscriptionPlan","Identity entities (User/Role/Claims/Tokens)"],"keyDetails":"Contains full schema mapping (properties, types, max lengths, indexes, relationships) plus seed data for SubscriptionPlan (4 entries). The snapshot enables migrations to detect model changes; it's a generated, data-layer artifact and not runtime business logic.","orchestrationMethods":[],"typedContracts":[{"name":"AppDbContextModelSnapshot","kind":"model","line":15,"fieldCount":1,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AppDbContextModelSnapshot","line":15,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"1b3a9db5890d457f33c69fc3a4a553421bac2a96fb55930bbc4407dcbdd0d3b0","sourceByteSize":26751,"analyzedAt":"2026-05-23T16:25:32.177Z","technology":"dotnet"}} |