// using System; using System.Text.Json; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Tiku.Infrastructure.Persistence; #nullable disable namespace Tiku.Infrastructure.Persistence.Migrations { [DbContext(typeof(TikuDbContext))] [Migration("20260725211732_AddContentAssetsAndImportPersistence")] partial class AddContentAssetsAndImportPersistence { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("ProductVersion", "10.0.10") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "citext"); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "ltree"); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); modelBuilder.Entity("Tiku.Domain.Catalog.Category", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CategoryType") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("category_type"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("NodeId") .HasColumnType("uuid") .HasColumnName("node_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("SvipQuestionLimit") .HasColumnType("integer") .HasColumnName("svip_question_limit"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_categories"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_categories_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_categories_tenant_id_legacy_id"); b.HasIndex("TenantId", "NodeId") .HasDatabaseName("ix_categories_tenant_id_node_id"); b.HasIndex("TenantId", "SubjectId") .HasDatabaseName("ix_categories_tenant_id_subject_id"); b.ToTable("categories", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.Major", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SchoolId") .HasColumnType("uuid") .HasColumnName("school_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("StudyTips") .HasColumnType("text") .HasColumnName("study_tips"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_majors"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_majors_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_majors_tenant_id_legacy_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_majors_tenant_id_region_id"); b.HasIndex("TenantId", "SchoolId") .HasDatabaseName("ix_majors_tenant_id_school_id"); b.ToTable("majors", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.ModuleNode", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacyModuleId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_module_id"); b.Property("LegacyParentId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_parent_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("ModuleId") .HasColumnType("uuid") .HasColumnName("module_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("ParentId") .HasColumnType("uuid") .HasColumnName("parent_id"); b.Property("Path") .HasMaxLength(1000) .HasColumnType("character varying(1000)") .HasColumnName("path"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Type") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("type"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_module_nodes"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_module_nodes_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_module_nodes_tenant_id_legacy_id"); b.HasIndex("TenantId", "ModuleId") .HasDatabaseName("ix_module_nodes_tenant_id_module_id"); b.HasIndex("TenantId", "ParentId") .HasDatabaseName("ix_module_nodes_tenant_id_parent_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_module_nodes_tenant_id_region_id"); b.ToTable("module_nodes", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.Region", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Code") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("code"); b.Property("Config") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("config") .HasDefaultValueSql("'{}'::jsonb"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("FullName") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("full_name"); b.Property("Icon") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("icon"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("IsHot") .HasColumnType("boolean") .HasColumnName("is_hot"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("name"); b.Property("Pinyin") .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("pinyin"); b.Property("ShortName") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("short_name"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_regions"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_regions_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_regions_tenant_id_legacy_id"); b.ToTable("regions", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.RegionModule", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Color") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("color"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("Icon") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("icon"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("IsPrimarySchoolModule") .HasColumnType("boolean") .HasColumnName("is_primary_school_module"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("Route") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("route"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("TextColor") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("text_color"); b.Property("Type") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("type"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_region_modules"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_region_modules_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_region_modules_tenant_id_legacy_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_region_modules_tenant_id_region_id"); b.ToTable("region_modules", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.School", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("ModuleId") .HasColumnType("uuid") .HasColumnName("module_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("ProfessionalExamDate") .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("professional_exam_date"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_schools"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_schools_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_schools_tenant_id_legacy_id"); b.HasIndex("TenantId", "ModuleId") .HasDatabaseName("ix_schools_tenant_id_module_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_schools_tenant_id_region_id"); b.ToTable("schools", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.Subject", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("Icon") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("icon"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("MajorId") .HasColumnType("uuid") .HasColumnName("major_id"); b.Property("MajorLegacyIds") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("major_legacy_ids") .HasDefaultValueSql("'[]'::jsonb"); b.Property("ModuleId") .HasColumnType("uuid") .HasColumnName("module_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("NodeId") .HasColumnType("uuid") .HasColumnName("node_id"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SchoolId") .HasColumnType("uuid") .HasColumnName("school_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("Stats") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("stats") .HasDefaultValueSql("'{}'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Type") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("type"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_subjects"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_subjects_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_subjects_tenant_id_legacy_id"); b.HasIndex("TenantId", "MajorId") .HasDatabaseName("ix_subjects_tenant_id_major_id"); b.HasIndex("TenantId", "ModuleId") .HasDatabaseName("ix_subjects_tenant_id_module_id"); b.HasIndex("TenantId", "NodeId") .HasDatabaseName("ix_subjects_tenant_id_node_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_subjects_tenant_id_region_id"); b.HasIndex("TenantId", "SchoolId") .HasDatabaseName("ix_subjects_tenant_id_school_id"); b.ToTable("subjects", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AssetKey") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("asset_key"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasMaxLength(1000) .HasColumnType("character varying(1000)") .HasColumnName("description"); b.Property("FileName") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("file_name"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_app_assets"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_app_assets_tenant_id_id"); b.HasIndex("TenantId", "AssetKey") .IsUnique() .HasDatabaseName("ix_app_assets_tenant_id_asset_key"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_app_assets_tenant_id_legacy_id"); b.ToTable("app_assets", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.ContentAsset", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AccessRules") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("access_rules") .HasDefaultValueSql("'{}'::jsonb"); b.Property("AssetKey") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("asset_key"); b.Property("AssetType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("asset_type"); b.Property("Bucket") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("bucket"); b.Property("Category") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("category"); b.Property("CategoryId") .HasColumnType("uuid") .HasColumnName("category_id"); b.Property("CdnUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("cdn_url"); b.Property("ChecksumSha256") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("checksum_sha256"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("DownloadCount") .HasColumnType("integer") .HasColumnName("download_count"); b.Property("FileName") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("file_name"); b.Property("FileSizeBytes") .HasColumnType("bigint") .HasColumnName("file_size_bytes"); b.Property("IsPublic") .HasColumnType("boolean") .HasColumnName("is_public"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("MimeType") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("mime_type"); b.Property("ObjectKey") .HasMaxLength(1000) .HasColumnType("character varying(1000)") .HasColumnName("object_key"); b.Property("PreviewObjectKey") .HasMaxLength(1000) .HasColumnType("character varying(1000)") .HasColumnName("preview_object_key"); b.Property("PreviewStatus") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("preview_status"); b.Property("PreviewUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("preview_url"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SecurityFlags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("security_flags") .HasDefaultValueSql("'{}'::jsonb"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("Source") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("source"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("StorageProvider") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("storage_provider"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Title") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("title"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedBy") .HasColumnType("uuid") .HasColumnName("updated_by"); b.Property("UploadStatus") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("upload_status"); b.Property("VerificationDetails") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("verification_details") .HasDefaultValueSql("'{}'::jsonb"); b.Property("VerifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("verified_at"); b.Property("VerifiedBy") .HasColumnType("uuid") .HasColumnName("verified_by"); b.Property("VerifiedChecksumSha256") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("verified_checksum_sha256"); b.Property("VerifiedSizeBytes") .HasColumnType("bigint") .HasColumnName("verified_size_bytes"); b.Property("Visibility") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("visibility"); b.HasKey("Id") .HasName("pk_content_assets"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_assets_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_content_assets_created_by"); b.HasIndex("UpdatedBy") .HasDatabaseName("ix_content_assets_updated_by"); b.HasIndex("VerifiedBy") .HasDatabaseName("ix_content_assets_verified_by"); b.HasIndex("TenantId", "CategoryId") .HasDatabaseName("ix_content_assets_tenant_id_category_id"); b.HasIndex("TenantId", "ChecksumSha256") .HasDatabaseName("ix_content_assets_tenant_id_checksum_sha256") .HasFilter("checksum_sha256 is not null"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_content_assets_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_content_assets_tenant_id_legacy_id"); b.HasIndex("TenantId", "PreviewStatus") .HasDatabaseName("ix_content_assets_tenant_id_preview_status") .HasFilter("preview_status <> 'none'"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_content_assets_tenant_id_region_id"); b.HasIndex("TenantId", "SubjectId") .HasDatabaseName("ix_content_assets_tenant_id_subject_id"); b.HasIndex("TenantId", "StorageProvider", "Bucket", "ObjectKey") .HasDatabaseName("ix_content_assets_tenant_id_storage_provider_bucket_object_key"); b.HasIndex("TenantId", "UploadStatus", "Status", "UpdatedAt") .HasDatabaseName("ix_content_assets_tenant_id_upload_status_status_updated_at"); b.HasIndex("TenantId", "Status", "Visibility", "AssetType", "RegionId", "SubjectId", "CategoryId", "SortOrder") .HasDatabaseName("ix_content_assets_tenant_id_status_visibility_asset_type_regio~"); b.ToTable("content_assets", null, t => { t.HasCheckConstraint("ck_content_assets_download_count", "download_count >= 0"); t.HasCheckConstraint("ck_content_assets_file_size", "file_size_bytes is null or file_size_bytes >= 0"); t.HasCheckConstraint("ck_content_assets_verified_checksum", "verified_checksum_sha256 is null or verified_checksum_sha256 ~ '^[a-f0-9]{64}$'"); t.HasCheckConstraint("ck_content_assets_verified_size", "verified_size_bytes is null or verified_size_bytes >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AccessRules") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("access_rules") .HasDefaultValueSql("'{}'::jsonb"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("Description") .HasMaxLength(2000) .HasColumnType("character varying(2000)") .HasColumnName("description"); b.Property("EntryKey") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("entry_key"); b.Property("EntryType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("entry_type"); b.Property("Icon") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("icon"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LayoutConfig") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("layout_config") .HasDefaultValueSql("'{}'::jsonb"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("Route") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("route"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedBy") .HasColumnType("uuid") .HasColumnName("updated_by"); b.Property("Visibility") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("visibility"); b.HasKey("Id") .HasName("pk_content_entries"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_entries_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_content_entries_created_by"); b.HasIndex("UpdatedBy") .HasDatabaseName("ix_content_entries_updated_by"); b.HasIndex("TenantId", "EntryKey") .IsUnique() .HasDatabaseName("ix_content_entries_tenant_id_entry_key"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_content_entries_tenant_id_legacy_id"); b.HasIndex("TenantId", "RegionId", "EntryType", "IsActive", "SortOrder") .HasDatabaseName("ix_content_entries_tenant_id_region_id_entry_type_is_active_so~"); b.ToTable("content_entries", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportIssue", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Code") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("code"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Details") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("details") .HasDefaultValueSql("'{}'::jsonb"); b.Property("FieldPath") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("field_path"); b.Property("ItemId") .HasColumnType("uuid") .HasColumnName("item_id"); b.Property("JobId") .HasColumnType("uuid") .HasColumnName("job_id"); b.Property("Message") .IsRequired() .HasMaxLength(2000) .HasColumnType("character varying(2000)") .HasColumnName("message"); b.Property("RowNo") .HasColumnType("integer") .HasColumnName("row_no"); b.Property("Severity") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("severity"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_content_import_issues"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_import_issues_tenant_id_id"); b.HasIndex("TenantId", "ItemId") .HasDatabaseName("ix_content_import_issues_tenant_id_item_id"); b.HasIndex("TenantId", "JobId", "Severity", "RowNo") .HasDatabaseName("ix_content_import_issues_tenant_id_job_id_severity_row_no"); b.ToTable("content_import_issues", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportItem", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("ContentHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("content_hash"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("ExternalId") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("external_id"); b.Property("IssuesCount") .HasColumnType("integer") .HasColumnName("issues_count"); b.Property("JobId") .HasColumnType("uuid") .HasColumnName("job_id"); b.Property("NormalizedPayload") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("normalized_payload") .HasDefaultValueSql("'{}'::jsonb"); b.Property("RowNo") .HasColumnType("integer") .HasColumnName("row_no"); b.Property("SourcePayload") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("source_payload") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TargetId") .HasColumnType("uuid") .HasColumnName("target_id"); b.Property("TargetType") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("target_type"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_content_import_items"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_import_items_tenant_id_id"); b.HasIndex("JobId", "RowNo") .IsUnique() .HasDatabaseName("ix_content_import_items_job_id_row_no"); b.HasIndex("TenantId", "JobId", "Status", "RowNo") .HasDatabaseName("ix_content_import_items_tenant_id_job_id_status_row_no"); b.ToTable("content_import_items", null, t => { t.HasCheckConstraint("ck_content_import_items_issues_count", "issues_count >= 0"); t.HasCheckConstraint("ck_content_import_items_row_no", "row_no >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportJob", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("DryRun") .HasColumnType("boolean") .HasColumnName("dry_run"); b.Property("ErrorCount") .HasColumnType("integer") .HasColumnName("error_count"); b.Property("ErrorMessage") .HasColumnType("text") .HasColumnName("error_message"); b.Property("FinishedAt") .HasColumnType("timestamp with time zone") .HasColumnName("finished_at"); b.Property("ImportType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("import_type"); b.Property("InsertedCount") .HasColumnType("integer") .HasColumnName("inserted_count"); b.Property("NormalizedPayload") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("normalized_payload") .HasDefaultValueSql("'[]'::jsonb"); b.Property("RawPayload") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("raw_payload") .HasDefaultValueSql("'[]'::jsonb"); b.Property("SkippedCount") .HasColumnType("integer") .HasColumnName("skipped_count"); b.Property("SourceFormat") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("source_format"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("SourceName") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("source_name"); b.Property("StartedAt") .HasColumnType("timestamp with time zone") .HasColumnName("started_at"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("Summary") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("summary") .HasDefaultValueSql("'{}'::jsonb"); b.Property("TargetCategoryId") .HasColumnType("uuid") .HasColumnName("target_category_id"); b.Property("TargetContentNodeId") .HasColumnType("uuid") .HasColumnName("target_content_node_id"); b.Property("TargetQuestionBankId") .HasColumnType("uuid") .HasColumnName("target_question_bank_id"); b.Property("TargetRegionId") .HasColumnType("uuid") .HasColumnName("target_region_id"); b.Property("TargetSubjectId") .HasColumnType("uuid") .HasColumnName("target_subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("TotalCount") .HasColumnType("integer") .HasColumnName("total_count"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedCount") .HasColumnType("integer") .HasColumnName("updated_count"); b.Property("ValidCount") .HasColumnType("integer") .HasColumnName("valid_count"); b.Property("WarningCount") .HasColumnType("integer") .HasColumnName("warning_count"); b.HasKey("Id") .HasName("pk_content_import_jobs"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_import_jobs_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_content_import_jobs_created_by"); b.HasIndex("TenantId", "TargetCategoryId") .HasDatabaseName("ix_content_import_jobs_tenant_id_target_category_id"); b.HasIndex("TenantId", "TargetContentNodeId") .HasDatabaseName("ix_content_import_jobs_tenant_id_target_content_node_id"); b.HasIndex("TenantId", "TargetQuestionBankId") .HasDatabaseName("ix_content_import_jobs_tenant_id_target_question_bank_id"); b.HasIndex("TenantId", "TargetRegionId") .HasDatabaseName("ix_content_import_jobs_tenant_id_target_region_id"); b.HasIndex("TenantId", "TargetSubjectId") .HasDatabaseName("ix_content_import_jobs_tenant_id_target_subject_id"); b.HasIndex("TenantId", "ImportType", "Status", "CreatedAt") .HasDatabaseName("ix_content_import_jobs_tenant_id_import_type_status_created_at"); b.ToTable("content_import_jobs", null, t => { t.HasCheckConstraint("ck_content_import_jobs_counts", "total_count >= 0 and valid_count >= 0 and error_count >= 0 and warning_count >= 0 and inserted_count >= 0 and updated_count >= 0 and skipped_count >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.ContentNode", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("Depth") .HasColumnType("integer") .HasColumnName("depth"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("IsLeaf") .HasColumnType("boolean") .HasColumnName("is_leaf"); b.Property("IsSelectable") .HasColumnType("boolean") .HasColumnName("is_selectable"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("MarkerConfig") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("marker_config") .HasDefaultValueSql("'{}'::jsonb"); b.Property("MarkerType") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("marker_type"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("NodeKey") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("node_key"); b.Property("NodeType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("node_type"); b.Property("ParentId") .HasColumnType("uuid") .HasColumnName("parent_id"); b.Property("Path") .HasColumnType("ltree") .HasColumnName("path"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedBy") .HasColumnType("uuid") .HasColumnName("updated_by"); b.HasKey("Id") .HasName("pk_content_nodes"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_content_nodes_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_content_nodes_created_by"); b.HasIndex("Path") .HasDatabaseName("ix_content_nodes_path"); NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Path"), "gist"); b.HasIndex("UpdatedBy") .HasDatabaseName("ix_content_nodes_updated_by"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_content_nodes_tenant_id_legacy_id"); b.HasIndex("TenantId", "MarkerType") .HasDatabaseName("ix_content_nodes_tenant_id_marker_type") .HasFilter("marker_type is not null"); b.HasIndex("TenantId", "ParentId") .HasDatabaseName("ix_content_nodes_tenant_id_parent_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_content_nodes_tenant_id_region_id"); b.HasIndex("TenantId", "EntryId", "NodeKey") .IsUnique() .HasDatabaseName("ix_content_nodes_tenant_id_entry_id_node_key"); b.HasIndex("TenantId", "EntryId", "ParentId", "SortOrder") .HasDatabaseName("ix_content_nodes_tenant_id_entry_id_parent_id_sort_order"); b.ToTable("content_nodes", null, t => { t.HasCheckConstraint("ck_content_nodes_depth", "depth >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookChapter", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_handbook_chapters"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_handbook_chapters_tenant_id_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_handbook_chapters_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_handbook_chapters_tenant_id_legacy_id"); b.HasIndex("TenantId", "SubjectId") .HasDatabaseName("ix_handbook_chapters_tenant_id_subject_id"); b.HasIndex("TenantId", "EntryId", "ContentNodeId", "SubjectId", "IsActive", "SortOrder") .HasDatabaseName("ix_handbook_chapters_tenant_id_entry_id_content_node_id_subjec~"); b.ToTable("handbook_chapters", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookEntry", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("ChapterId") .HasColumnType("uuid") .HasColumnName("chapter_id"); b.Property("Content") .HasColumnType("text") .HasColumnName("content"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("Summary") .HasColumnType("text") .HasColumnName("summary"); b.Property("Tags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("tags") .HasDefaultValueSql("'[]'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Title") .IsRequired() .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("title"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_handbook_entries"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_handbook_entries_tenant_id_id"); b.HasIndex("TenantId", "ChapterId") .HasDatabaseName("ix_handbook_entries_tenant_id_chapter_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_handbook_entries_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_handbook_entries_tenant_id_legacy_id"); b.HasIndex("TenantId", "EntryId", "ContentNodeId", "ChapterId", "IsActive", "SortOrder") .HasDatabaseName("ix_handbook_entries_tenant_id_entry_id_content_node_id_chapter~"); b.ToTable("handbook_entries", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookSubject", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Color") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("color"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("Icon") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("icon"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("MajorId") .HasColumnType("uuid") .HasColumnName("major_id"); b.Property("MajorLegacyIds") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("major_legacy_ids") .HasDefaultValueSql("'[]'::jsonb"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SchoolId") .HasColumnType("uuid") .HasColumnName("school_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Type") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("type"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_handbook_subjects"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_handbook_subjects_tenant_id_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_handbook_subjects_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_handbook_subjects_tenant_id_legacy_id"); b.HasIndex("TenantId", "MajorId") .HasDatabaseName("ix_handbook_subjects_tenant_id_major_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_handbook_subjects_tenant_id_region_id"); b.HasIndex("TenantId", "SchoolId") .HasDatabaseName("ix_handbook_subjects_tenant_id_school_id"); b.HasIndex("TenantId", "EntryId", "ContentNodeId", "RegionId", "IsActive", "SortOrder") .HasDatabaseName("ix_handbook_subjects_tenant_id_entry_id_content_node_id_region~"); b.ToTable("handbook_subjects", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.ImageAsset", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Category") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("category"); b.Property("CdnUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("cdn_url"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("FileName") .HasMaxLength(500) .HasColumnType("character varying(500)") .HasColumnName("file_name"); b.Property("IsPublic") .HasColumnType("boolean") .HasColumnName("is_public"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Title") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("title"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_images"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_images_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_images_tenant_id_legacy_id"); b.HasIndex("TenantId", "Category", "IsPublic") .HasDatabaseName("ix_images_tenant_id_category_is_public"); b.ToTable("images", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.PracticeBlueprint", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AssemblyType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("assembly_type"); b.Property("CollectionId") .HasColumnType("uuid") .HasColumnName("collection_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("DurationMinutes") .HasColumnType("integer") .HasColumnName("duration_minutes"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Mode") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("mode"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("NodeId") .HasColumnType("uuid") .HasColumnName("node_id"); b.Property("PassScore") .HasPrecision(8, 2) .HasColumnType("numeric(8,2)") .HasColumnName("pass_score"); b.Property("QuestionLimit") .HasColumnType("integer") .HasColumnName("question_limit"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("Rules") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("rules") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Sections") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("sections") .HasDefaultValueSql("'[]'::jsonb"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("TotalScore") .HasPrecision(8, 2) .HasColumnType("numeric(8,2)") .HasColumnName("total_score"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedBy") .HasColumnType("uuid") .HasColumnName("updated_by"); b.HasKey("Id") .HasName("pk_practice_blueprints"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_practice_blueprints_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_practice_blueprints_created_by"); b.HasIndex("UpdatedBy") .HasDatabaseName("ix_practice_blueprints_updated_by"); b.HasIndex("TenantId", "CollectionId") .HasDatabaseName("ix_practice_blueprints_tenant_id_collection_id"); b.HasIndex("TenantId", "EntryId") .HasDatabaseName("ix_practice_blueprints_tenant_id_entry_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_practice_blueprints_tenant_id_legacy_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_practice_blueprints_tenant_id_region_id"); b.HasIndex("TenantId", "NodeId", "CollectionId", "Mode", "Status", "SortOrder") .HasDatabaseName("ix_practice_blueprints_tenant_id_node_id_collection_id_mode_st~"); b.ToTable("practice_blueprints", null, t => { t.HasCheckConstraint("ck_practice_blueprints_duration", "duration_minutes is null or duration_minutes > 0"); t.HasCheckConstraint("ck_practice_blueprints_question_limit", "question_limit is null or question_limit > 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CategoryId") .HasColumnType("uuid") .HasColumnName("category_id"); b.Property("CollectionType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("collection_type"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("DurationMinutes") .HasColumnType("integer") .HasColumnName("duration_minutes"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("Filters") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("filters") .HasDefaultValueSql("'{}'::jsonb"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("NodeId") .HasColumnType("uuid") .HasColumnName("node_id"); b.Property("QuestionBankId") .HasColumnType("uuid") .HasColumnName("question_bank_id"); b.Property("QuestionCount") .HasColumnType("integer") .HasColumnName("question_count"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("source_type"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("TotalScore") .HasPrecision(8, 2) .HasColumnType("numeric(8,2)") .HasColumnName("total_score"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UpdatedBy") .HasColumnType("uuid") .HasColumnName("updated_by"); b.HasKey("Id") .HasName("pk_question_collections"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_collections_tenant_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_question_collections_created_by"); b.HasIndex("UpdatedBy") .HasDatabaseName("ix_question_collections_updated_by"); b.HasIndex("TenantId", "CategoryId") .HasDatabaseName("ix_question_collections_tenant_id_category_id"); b.HasIndex("TenantId", "EntryId") .HasDatabaseName("ix_question_collections_tenant_id_entry_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_question_collections_tenant_id_legacy_id"); b.HasIndex("TenantId", "QuestionBankId") .HasDatabaseName("ix_question_collections_tenant_id_question_bank_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_question_collections_tenant_id_region_id"); b.HasIndex("TenantId", "SubjectId") .HasDatabaseName("ix_question_collections_tenant_id_subject_id"); b.HasIndex("TenantId", "NodeId", "Status", "SortOrder") .HasDatabaseName("ix_question_collections_tenant_id_node_id_status_sort_order"); b.ToTable("question_collections", null, t => { t.HasCheckConstraint("ck_question_collections_duration", "duration_minutes is null or duration_minutes > 0"); t.HasCheckConstraint("ck_question_collections_question_count", "question_count >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionCollectionItem", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CollectionId") .HasColumnType("uuid") .HasColumnName("collection_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("Required") .HasColumnType("boolean") .HasColumnName("required"); b.Property("Score") .HasPrecision(8, 2) .HasColumnType("numeric(8,2)") .HasColumnName("score"); b.Property("SectionKey") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("section_key"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_question_collection_items"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_collection_items_tenant_id_id"); b.HasIndex("TenantId", "QuestionId") .HasDatabaseName("ix_question_collection_items_tenant_id_question_id"); b.HasIndex("TenantId", "CollectionId", "QuestionId") .IsUnique() .HasDatabaseName("ix_question_collection_items_tenant_id_collection_id_question_~"); b.HasIndex("TenantId", "CollectionId", "SectionKey", "SortOrder") .HasDatabaseName("ix_question_collection_items_tenant_id_collection_id_section_k~"); b.ToTable("question_collection_items", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionTypeGroup", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("DisplayName") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("display_name"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Types") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("types") .HasDefaultValueSql("'[]'::jsonb"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_question_type_groups"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_type_groups_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_question_type_groups_tenant_id_legacy_id"); b.HasIndex("TenantId", "SubjectId", "IsActive", "SortOrder") .HasDatabaseName("ix_question_type_groups_tenant_id_subject_id_is_active_sort_or~"); b.ToTable("question_type_groups", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionVideo", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacyQuestionId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_question_id"); b.Property("LegacyVideoId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_video_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("VideoId") .HasColumnType("uuid") .HasColumnName("video_id"); b.Property("VideoType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("video_type"); b.HasKey("Id") .HasName("pk_question_videos"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_videos_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_question_videos_tenant_id_legacy_id"); b.HasIndex("TenantId", "VideoId") .HasDatabaseName("ix_question_videos_tenant_id_video_id"); b.HasIndex("TenantId", "QuestionId", "VideoId", "VideoType") .IsUnique() .HasDatabaseName("ix_question_videos_tenant_id_question_id_video_id_video_type"); b.ToTable("question_videos", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.SubjectShare", b => { b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("SourceSubjectId") .HasColumnType("uuid") .HasColumnName("source_subject_id"); b.Property("TargetSubjectId") .HasColumnType("uuid") .HasColumnName("target_subject_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Id") .HasColumnType("uuid") .HasColumnName("id"); b.Property("LegacyId") .HasColumnType("text") .HasColumnName("legacy_id"); b.Property("LegacySourceSubjectId") .HasColumnType("text") .HasColumnName("legacy_source_subject_id"); b.Property("LegacyTargetSubjectId") .HasColumnType("text") .HasColumnName("legacy_target_subject_id"); b.Property("UpdatedAt") .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); b.HasKey("TenantId", "SourceSubjectId", "TargetSubjectId") .HasName("pk_subject_shares"); b.HasIndex("TenantId", "TargetSubjectId") .HasDatabaseName("ix_subject_shares_tenant_id_target_subject_id"); b.ToTable("subject_shares", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("FavoritedAt") .HasColumnType("timestamp with time zone") .HasColumnName("favorited_at"); b.Property("LegacyId") .HasColumnType("text") .HasColumnName("legacy_id"); b.Property("LegacyUserId") .HasColumnType("text") .HasColumnName("legacy_user_id"); b.Property("LegacyWordId") .HasColumnType("text") .HasColumnName("legacy_word_id"); b.Property("Note") .HasMaxLength(1000) .HasColumnType("character varying(1000)") .HasColumnName("note"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.Property("WordId") .HasColumnType("uuid") .HasColumnName("word_id"); b.HasKey("Id") .HasName("pk_user_word_favorites"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_user_word_favorites_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_user_word_favorites_user_id"); b.HasIndex("TenantId", "WordId") .HasDatabaseName("ix_user_word_favorites_tenant_id_word_id"); b.HasIndex("TenantId", "UserId", "WordId") .IsUnique() .HasDatabaseName("ix_user_word_favorites_tenant_id_user_id_word_id"); b.ToTable("user_word_favorites", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.UserWordProgress", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CorrectCount") .HasColumnType("integer") .HasColumnName("correct_count"); b.Property("CorrectStreak") .HasColumnType("integer") .HasColumnName("correct_streak"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("DueLevel") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("due_level"); b.Property("EaseFactor") .ValueGeneratedOnAdd() .HasPrecision(4, 2) .HasColumnType("numeric(4,2)") .HasDefaultValue(2.50m) .HasColumnName("ease_factor"); b.Property("LastResult") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("last_result"); b.Property("LastReviewAt") .HasColumnType("timestamp with time zone") .HasColumnName("last_review_at"); b.Property("LegacyId") .HasColumnType("text") .HasColumnName("legacy_id"); b.Property("LegacyUserId") .HasColumnType("text") .HasColumnName("legacy_user_id"); b.Property("LegacyWordId") .HasColumnType("text") .HasColumnName("legacy_word_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("NextReviewAt") .HasColumnType("timestamp with time zone") .HasColumnName("next_review_at"); b.Property("ReviewCount") .HasColumnType("integer") .HasColumnName("review_count"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.Property("WordId") .HasColumnType("uuid") .HasColumnName("word_id"); b.Property("WrongCount") .HasColumnType("integer") .HasColumnName("wrong_count"); b.HasKey("Id") .HasName("pk_user_word_progress"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_user_word_progress_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_user_word_progress_user_id"); b.HasIndex("TenantId", "WordId") .HasDatabaseName("ix_user_word_progress_tenant_id_word_id"); b.HasIndex("TenantId", "UserId", "WordId") .IsUnique() .HasDatabaseName("ix_user_word_progress_tenant_id_user_id_word_id"); b.HasIndex("TenantId", "UserId", "NextReviewAt", "Status", "DueLevel") .HasDatabaseName("ix_user_word_progress_tenant_id_user_id_next_review_at_status_~"); b.ToTable("user_word_progress", null, t => { t.HasCheckConstraint("ck_user_word_progress_correct_streak", "correct_streak >= 0"); t.HasCheckConstraint("ck_user_word_progress_ease_factor", "ease_factor >= 1.30 and ease_factor <= 3.00"); t.HasCheckConstraint("ck_user_word_progress_review_count", "review_count >= 0"); }); }); modelBuilder.Entity("Tiku.Domain.Content.VideoExplanation", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("Difficulty") .HasColumnType("integer") .HasColumnName("difficulty"); b.Property("DurationSeconds") .HasColumnType("integer") .HasColumnName("duration_seconds"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("IsGeneral") .HasColumnType("boolean") .HasColumnName("is_general"); b.Property("KnowledgeTags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("knowledge_tags") .HasDefaultValueSql("'[]'::jsonb"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacySubjectId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_subject_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("ThumbnailUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("thumbnail_url"); b.Property("Title") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("title"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("VideoUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("video_url"); b.HasKey("Id") .HasName("pk_video_explanations"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_video_explanations_tenant_id_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_video_explanations_tenant_id_legacy_id"); b.HasIndex("TenantId", "SourceHash") .HasDatabaseName("ix_video_explanations_tenant_id_source_hash") .HasFilter("source_hash is not null"); b.HasIndex("TenantId", "SubjectId", "IsActive", "SortOrder") .HasDatabaseName("ix_video_explanations_tenant_id_subject_id_is_active_sort_order"); b.ToTable("video_explanations", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.VocabularyUnit", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Description") .HasColumnType("text") .HasColumnName("description"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("WordCount") .HasColumnType("integer") .HasColumnName("word_count"); b.HasKey("Id") .HasName("pk_vocabulary_units"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_vocabulary_units_tenant_id_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_vocabulary_units_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_vocabulary_units_tenant_id_legacy_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_vocabulary_units_tenant_id_region_id"); b.HasIndex("TenantId", "EntryId", "ContentNodeId", "RegionId", "IsActive", "SortOrder") .HasDatabaseName("ix_vocabulary_units_tenant_id_entry_id_content_node_id_region_~"); b.ToTable("vocabulary_units", (string)null); }); modelBuilder.Entity("Tiku.Domain.Content.VocabularyWord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Difficulty") .HasColumnType("integer") .HasColumnName("difficulty"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("Example") .HasColumnType("text") .HasColumnName("example"); b.Property("ExampleTranslation") .HasColumnType("text") .HasColumnName("example_translation"); b.Property("IsActive") .HasColumnType("boolean") .HasColumnName("is_active"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Meaning") .HasColumnType("text") .HasColumnName("meaning"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Phonetic") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("phonetic"); b.Property("SortOrder") .HasColumnType("integer") .HasColumnName("sort_order"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("Tags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("tags") .HasDefaultValueSql("'[]'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UnitId") .HasColumnType("uuid") .HasColumnName("unit_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("Word") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("word"); b.HasKey("Id") .HasName("pk_vocabulary_words"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_vocabulary_words_tenant_id_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_vocabulary_words_tenant_id_content_node_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_vocabulary_words_tenant_id_legacy_id"); b.HasIndex("TenantId", "UnitId", "IsActive", "SortOrder", "CreatedAt") .HasDatabaseName("ix_vocabulary_words_tenant_id_unit_id_is_active_sort_order_cre~"); b.HasIndex("TenantId", "EntryId", "ContentNodeId", "UnitId", "IsActive", "SortOrder") .HasDatabaseName("ix_vocabulary_words_tenant_id_entry_id_content_node_id_unit_id~"); b.ToTable("vocabulary_words", (string)null); }); modelBuilder.Entity("Tiku.Domain.Identity.StudentProfile", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LastCheckInDate") .HasColumnType("date") .HasColumnName("last_check_in_date"); b.Property("LegacyUserId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_user_id"); b.Property("MasteredWordsCount") .HasColumnType("integer") .HasColumnName("mastered_words_count"); b.Property("ModuleSelections") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("module_selections") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Progress") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("progress") .HasDefaultValueSql("'{}'::jsonb"); b.Property("QuestionsAnsweredToday") .HasColumnType("integer") .HasColumnName("questions_answered_today"); b.Property("RecentActivities") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("recent_activities") .HasDefaultValueSql("'[]'::jsonb"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SelectedMajorId") .HasColumnType("uuid") .HasColumnName("selected_major_id"); b.Property("SelectedSchoolId") .HasColumnType("uuid") .HasColumnName("selected_school_id"); b.Property("Stats") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("stats") .HasDefaultValueSql("'{}'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_student_profiles"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_student_profiles_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_student_profiles_user_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_student_profiles_tenant_id_region_id"); b.HasIndex("TenantId", "SelectedMajorId") .HasDatabaseName("ix_student_profiles_tenant_id_selected_major_id"); b.HasIndex("TenantId", "SelectedSchoolId") .HasDatabaseName("ix_student_profiles_tenant_id_selected_school_id"); b.HasIndex("TenantId", "UserId") .IsUnique() .HasDatabaseName("ix_student_profiles_tenant_id_user_id"); b.ToTable("student_profiles", (string)null); }); modelBuilder.Entity("Tiku.Domain.Identity.User", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AvatarUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("avatar_url"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Email") .HasMaxLength(320) .HasColumnType("citext") .HasColumnName("email"); b.Property("LastSeenAt") .HasColumnType("timestamp with time zone") .HasColumnName("last_seen_at"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacyPasswordHash") .HasMaxLength(512) .HasColumnType("character varying(512)") .HasColumnName("legacy_password_hash"); b.Property("Name") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("name"); b.Property("PasswordMigrationRequired") .HasColumnType("boolean") .HasColumnName("password_migration_required"); b.Property("Phone") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("phone"); b.Property("PrimaryRole") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("primary_role"); b.Property("RawProfile") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("raw_profile") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Score") .HasColumnType("integer") .HasColumnName("score"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("Username") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("username"); b.HasKey("Id") .HasName("pk_users"); b.HasIndex("Email") .IsUnique() .HasDatabaseName("ix_users_email"); b.HasIndex("LegacyId") .IsUnique() .HasDatabaseName("ix_users_legacy_id"); b.HasIndex("Phone") .IsUnique() .HasDatabaseName("ix_users_phone"); b.HasIndex("Username") .IsUnique() .HasDatabaseName("ix_users_username"); b.ToTable("users", (string)null); }); modelBuilder.Entity("Tiku.Domain.Identity.UserIdentity", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Email") .HasMaxLength(320) .HasColumnType("citext") .HasColumnName("email"); b.Property("OpenId") .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("open_id"); b.Property("Phone") .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("phone"); b.Property("Provider") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("provider"); b.Property("ProviderSubject") .IsRequired() .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("provider_subject"); b.Property("SecretPayload") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("secret_payload") .HasDefaultValueSql("'{}'::jsonb"); b.Property("UnionId") .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("union_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_user_identities"); b.HasIndex("UserId") .HasDatabaseName("ix_user_identities_user_id"); b.HasIndex("Provider", "ProviderSubject") .IsUnique() .HasDatabaseName("ix_user_identities_provider_provider_subject"); b.ToTable("user_identities", (string)null); }); modelBuilder.Entity("Tiku.Domain.Learning.AnswerRecord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AnswerText") .HasColumnType("text") .HasColumnName("answer_text"); b.Property("AnsweredAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("answered_at") .HasDefaultValueSql("now()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("IsCorrect") .HasColumnType("boolean") .HasColumnName("is_correct"); b.Property("LegacyCategoryId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_category_id"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacyQuestionId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_question_id"); b.Property("PracticeSessionId") .HasColumnType("uuid") .HasColumnName("practice_session_id"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("QuestionVersionId") .HasColumnType("uuid") .HasColumnName("question_version_id"); b.Property("SelectedOptions") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("selected_options") .HasDefaultValueSql("'[]'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_answer_records"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_answer_records_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_answer_records_user_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_answer_records_tenant_id_legacy_id"); b.HasIndex("TenantId", "QuestionId") .HasDatabaseName("ix_answer_records_tenant_id_question_id"); b.HasIndex("TenantId", "QuestionId", "QuestionVersionId") .HasDatabaseName("ix_answer_records_tenant_id_question_id_question_version_id"); b.HasIndex("TenantId", "UserId", "PracticeSessionId") .HasDatabaseName("ix_answer_records_tenant_id_user_id_practice_session_id"); b.ToTable("answer_records", null, t => { t.HasCheckConstraint("ck_answer_records_version_requires_question", "question_version_id is null or question_id is not null"); }); }); modelBuilder.Entity("Tiku.Domain.Learning.FavoriteQuestion", b => { b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Source") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("source"); b.HasKey("TenantId", "UserId", "QuestionId") .HasName("pk_favorite_questions"); b.HasIndex("UserId") .HasDatabaseName("ix_favorite_questions_user_id"); b.HasIndex("TenantId", "QuestionId") .HasDatabaseName("ix_favorite_questions_tenant_id_question_id"); b.ToTable("favorite_questions", (string)null); }); modelBuilder.Entity("Tiku.Domain.Learning.PracticeSession", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("BlueprintId") .HasColumnType("uuid") .HasColumnName("blueprint_id"); b.Property("CollectionId") .HasColumnType("uuid") .HasColumnName("collection_id"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("DurationMinutes") .HasColumnType("integer") .HasColumnName("duration_minutes"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("ExpiresAt") .HasColumnType("timestamp with time zone") .HasColumnName("expires_at"); b.Property("FinishedAt") .HasColumnType("timestamp with time zone") .HasColumnName("finished_at"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Mode") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("mode"); b.Property("QuestionCount") .HasColumnType("integer") .HasColumnName("question_count"); b.Property("QuestionIds") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("question_ids") .HasDefaultValueSql("'[]'::jsonb"); b.Property("StartedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("started_at") .HasDefaultValueSql("now()"); b.Property("TargetId") .HasColumnType("uuid") .HasColumnName("target_id"); b.Property("TargetType") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("target_type"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("TotalScore") .HasPrecision(8, 2) .HasColumnType("numeric(8,2)") .HasColumnName("total_score"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_practice_sessions"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_practice_sessions_tenant_id_id"); b.HasAlternateKey("TenantId", "UserId", "Id") .HasName("ak_practice_sessions_tenant_id_user_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_practice_sessions_user_id"); b.HasIndex("TenantId", "BlueprintId") .HasDatabaseName("ix_practice_sessions_tenant_id_blueprint_id"); b.HasIndex("TenantId", "CollectionId") .HasDatabaseName("ix_practice_sessions_tenant_id_collection_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_practice_sessions_tenant_id_content_node_id"); b.HasIndex("TenantId", "EntryId") .HasDatabaseName("ix_practice_sessions_tenant_id_entry_id"); b.HasIndex("TenantId", "UserId", "StartedAt") .HasDatabaseName("ix_practice_sessions_tenant_id_user_id_started_at"); b.ToTable("practice_sessions", (string)null); }); modelBuilder.Entity("Tiku.Domain.Learning.RecentPractice", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("Color") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("color"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LastAccessAt") .HasColumnType("timestamp with time zone") .HasColumnName("last_access_at"); b.Property("LastPracticeAt") .HasColumnType("timestamp with time zone") .HasColumnName("last_practice_at"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("PracticeType") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("practice_type"); b.Property("Progress") .HasColumnType("integer") .HasColumnName("progress"); b.Property("TargetLegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("target_legacy_id"); b.Property("TargetName") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("target_name"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_recent_practices"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_recent_practices_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_recent_practices_user_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_recent_practices_tenant_id_legacy_id"); b.HasIndex("TenantId", "UserId", "LastAccessAt") .HasDatabaseName("ix_recent_practices_tenant_id_user_id_last_access_at"); b.ToTable("recent_practices", (string)null); }); modelBuilder.Entity("Tiku.Domain.Learning.WrongQuestion", b => { b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("LastWrongAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("last_wrong_at") .HasDefaultValueSql("now()"); b.Property("ResolvedAt") .HasColumnType("timestamp with time zone") .HasColumnName("resolved_at"); b.Property("WrongCount") .ValueGeneratedOnAdd() .HasColumnType("integer") .HasDefaultValue(1) .HasColumnName("wrong_count"); b.HasKey("TenantId", "UserId", "QuestionId") .HasName("pk_wrong_questions"); b.HasIndex("UserId") .HasDatabaseName("ix_wrong_questions_user_id"); b.HasIndex("TenantId", "QuestionId") .HasDatabaseName("ix_wrong_questions_tenant_id_question_id"); b.ToTable("wrong_questions", (string)null); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.Question", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CategoryId") .HasColumnType("uuid") .HasColumnName("category_id"); b.Property("ContentNodeId") .HasColumnType("uuid") .HasColumnName("content_node_id"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CurrentVersionId") .HasColumnType("uuid") .HasColumnName("current_version_id"); b.Property("Difficulty") .HasColumnType("integer") .HasColumnName("difficulty"); b.Property("EntryId") .HasColumnType("uuid") .HasColumnName("entry_id"); b.Property("ExamMarkers") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("exam_markers") .HasDefaultValueSql("'{}'::jsonb"); b.Property("HasVideoExplanation") .HasColumnType("boolean") .HasColumnName("has_video_explanation"); b.Property("LegacyCategoryId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_category_id"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegacyNodeId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_node_id"); b.Property("LegacySubjectId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_subject_id"); b.Property("MediaUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("media_url"); b.Property("NodeId") .HasColumnType("uuid") .HasColumnName("node_id"); b.Property("PrimaryCollectionId") .HasColumnType("uuid") .HasColumnName("primary_collection_id"); b.Property("QuestionBankId") .HasColumnType("uuid") .HasColumnName("question_bank_id"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("SubjectId") .HasColumnType("uuid") .HasColumnName("subject_id"); b.Property("Tags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("tags") .HasDefaultValueSql("'[]'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("Type") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("type"); b.Property("TypeLabel") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("type_label"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_questions"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_questions_tenant_id_id"); b.HasIndex("TenantId", "CategoryId") .HasDatabaseName("ix_questions_tenant_id_category_id"); b.HasIndex("TenantId", "ContentNodeId") .HasDatabaseName("ix_questions_tenant_id_content_node_id"); b.HasIndex("TenantId", "EntryId") .HasDatabaseName("ix_questions_tenant_id_entry_id"); b.HasIndex("TenantId", "LegacyId") .IsUnique() .HasDatabaseName("ix_questions_tenant_id_legacy_id"); b.HasIndex("TenantId", "NodeId") .HasDatabaseName("ix_questions_tenant_id_node_id"); b.HasIndex("TenantId", "PrimaryCollectionId") .HasDatabaseName("ix_questions_tenant_id_primary_collection_id"); b.HasIndex("TenantId", "QuestionBankId") .HasDatabaseName("ix_questions_tenant_id_question_bank_id"); b.HasIndex("TenantId", "SubjectId") .HasDatabaseName("ix_questions_tenant_id_subject_id"); b.HasIndex("TenantId", "Id", "CurrentVersionId") .HasDatabaseName("ix_questions_tenant_id_id_current_version_id"); b.ToTable("questions", (string)null); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionBank", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Name") .IsRequired() .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("name"); b.Property("RegionId") .HasColumnType("uuid") .HasColumnName("region_id"); b.Property("SourceScope") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("source_scope"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_question_banks"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_banks_tenant_id_id"); b.HasIndex("TenantId", "RegionId") .HasDatabaseName("ix_question_banks_tenant_id_region_id"); b.ToTable("question_banks", (string)null); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionVersion", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("AnswerText") .HasColumnType("text") .HasColumnName("answer_text"); b.Property("CodeLang") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("code_lang"); b.Property("CodeTemplate") .HasColumnType("text") .HasColumnName("code_template"); b.Property("Content") .HasColumnType("text") .HasColumnName("content"); b.Property("CorrectOptionIndex") .HasColumnType("integer") .HasColumnName("correct_option_index"); b.Property("CorrectOptionIndices") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("correct_option_indices") .HasDefaultValueSql("'[]'::jsonb"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("CreatedBy") .HasColumnType("uuid") .HasColumnName("created_by"); b.Property("Explanation") .HasColumnType("text") .HasColumnName("explanation"); b.Property("Options") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("options") .HasDefaultValueSql("'[]'::jsonb"); b.Property("QuestionId") .HasColumnType("uuid") .HasColumnName("question_id"); b.Property("SourceHash") .HasMaxLength(128) .HasColumnType("character varying(128)") .HasColumnName("source_hash"); b.Property("SubQuestions") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("sub_questions") .HasDefaultValueSql("'[]'::jsonb"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("VersionNo") .HasColumnType("integer") .HasColumnName("version_no"); b.HasKey("Id") .HasName("pk_question_versions"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_question_versions_tenant_id_id"); b.HasAlternateKey("TenantId", "QuestionId", "Id") .HasName("ak_question_versions_tenant_id_question_id_id"); b.HasIndex("CreatedBy") .HasDatabaseName("ix_question_versions_created_by"); b.HasIndex("QuestionId", "VersionNo") .IsUnique() .HasDatabaseName("ix_question_versions_question_id_version_no"); b.ToTable("question_versions", (string)null); }); modelBuilder.Entity("Tiku.Domain.Tenancy.Tenant", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("BillingStatus") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("billing_status"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LegacyId") .HasMaxLength(64) .HasColumnType("character varying(64)") .HasColumnName("legacy_id"); b.Property("LegalName") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("legal_name"); b.Property("Metadata") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("metadata") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Mode") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("mode"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("name"); b.Property("OwnerUserId") .HasColumnType("uuid") .HasColumnName("owner_user_id"); b.Property("Slug") .IsRequired() .HasMaxLength(100) .HasColumnType("citext") .HasColumnName("slug"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("Id") .HasName("pk_tenants"); b.HasIndex("LegacyId") .IsUnique() .HasDatabaseName("ix_tenants_legacy_id"); b.HasIndex("OwnerUserId") .HasDatabaseName("ix_tenants_owner_user_id"); b.HasIndex("Slug") .IsUnique() .HasDatabaseName("ix_tenants_slug"); b.ToTable("tenants", (string)null); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantBranding", b => { b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("BrandName") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("brand_name"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("FaviconUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("favicon_url"); b.Property("LogoUrl") .HasMaxLength(2048) .HasColumnType("character varying(2048)") .HasColumnName("logo_url"); b.Property("OrganizationName") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("organization_name"); b.Property("PublicAssets") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("public_assets") .HasDefaultValueSql("'{}'::jsonb"); b.Property("ServiceAccountName") .HasMaxLength(200) .HasColumnType("character varying(200)") .HasColumnName("service_account_name"); b.Property("ServiceWechat") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("service_wechat"); b.Property("ShortName") .HasMaxLength(100) .HasColumnType("character varying(100)") .HasColumnName("short_name"); b.Property("Slogan") .HasMaxLength(300) .HasColumnType("character varying(300)") .HasColumnName("slogan"); b.Property("Theme") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("theme") .HasDefaultValueSql("'{}'::jsonb"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("TenantId") .HasName("pk_tenant_branding"); b.ToTable("tenant_branding", (string)null); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantDomain", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("DomainType") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("domain_type"); b.Property("Host") .IsRequired() .HasMaxLength(253) .HasColumnType("citext") .HasColumnName("host"); b.Property("IsPrimary") .HasColumnType("boolean") .HasColumnName("is_primary"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("VerificationToken") .HasMaxLength(256) .HasColumnType("character varying(256)") .HasColumnName("verification_token"); b.Property("VerifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("verified_at"); b.HasKey("Id") .HasName("pk_tenant_domains"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_tenant_domains_tenant_id_id"); b.HasIndex("Host") .IsUnique() .HasDatabaseName("ix_tenant_domains_host"); b.HasIndex("TenantId", "IsPrimary") .IsUnique() .HasDatabaseName("ix_tenant_domains_tenant_id_is_primary") .HasFilter("is_primary"); b.ToTable("tenant_domains", (string)null); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantMembership", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasColumnName("id") .HasDefaultValueSql("gen_random_uuid()"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("LegacyRole") .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("legacy_role"); b.Property("Permissions") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("permissions") .HasDefaultValueSql("'{}'::jsonb"); b.Property("Role") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("role"); b.Property("Status") .IsRequired() .HasMaxLength(32) .HasColumnType("character varying(32)") .HasColumnName("status"); b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_tenant_memberships"); b.HasAlternateKey("TenantId", "Id") .HasName("ak_tenant_memberships_tenant_id_id"); b.HasIndex("UserId") .HasDatabaseName("ix_tenant_memberships_user_id"); b.HasIndex("TenantId", "UserId", "Role") .IsUnique() .HasDatabaseName("ix_tenant_memberships_tenant_id_user_id_role"); b.ToTable("tenant_memberships", (string)null); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantSettings", b => { b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); b.Property("AdminFeatureFlags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("admin_feature_flags") .HasDefaultValueSql("'{}'::jsonb"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("created_at") .HasDefaultValueSql("now()"); b.Property("FeatureFlags") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("feature_flags") .HasDefaultValueSql("'{}'::jsonb"); b.Property("PublicConfig") .ValueGeneratedOnAdd() .HasColumnType("jsonb") .HasColumnName("public_config") .HasDefaultValueSql("'{}'::jsonb"); b.Property("UpdatedAt") .ValueGeneratedOnAdd() .HasColumnType("timestamp with time zone") .HasColumnName("updated_at") .HasDefaultValueSql("now()"); b.HasKey("TenantId") .HasName("pk_tenant_settings"); b.ToTable("tenant_settings", (string)null); }); modelBuilder.Entity("Tiku.Domain.Catalog.Category", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_categories_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.ModuleNode", null) .WithMany() .HasForeignKey("TenantId", "NodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_categories_module_nodes_tenant_id_node_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_categories_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.Major", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_majors_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_majors_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.School", null) .WithMany() .HasForeignKey("TenantId", "SchoolId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_majors_schools_tenant_id_school_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.ModuleNode", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_module_nodes_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.RegionModule", null) .WithMany() .HasForeignKey("TenantId", "ModuleId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_module_nodes_region_modules_tenant_id_module_id"); b.HasOne("Tiku.Domain.Catalog.ModuleNode", null) .WithMany() .HasForeignKey("TenantId", "ParentId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_module_nodes_module_nodes_tenant_id_parent_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_module_nodes_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.Region", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_regions_tenants_tenant_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.RegionModule", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_region_modules_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_region_modules_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.School", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_schools_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.RegionModule", null) .WithMany() .HasForeignKey("TenantId", "ModuleId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_schools_region_modules_tenant_id_module_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_schools_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Catalog.Subject", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_subjects_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Major", null) .WithMany() .HasForeignKey("TenantId", "MajorId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_subjects_majors_tenant_id_major_id"); b.HasOne("Tiku.Domain.Catalog.RegionModule", null) .WithMany() .HasForeignKey("TenantId", "ModuleId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_subjects_region_modules_tenant_id_module_id"); b.HasOne("Tiku.Domain.Catalog.ModuleNode", null) .WithMany() .HasForeignKey("TenantId", "NodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_subjects_module_nodes_tenant_id_node_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_subjects_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.School", null) .WithMany() .HasForeignKey("TenantId", "SchoolId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_subjects_schools_tenant_id_school_id"); }); modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_app_assets_tenants_tenant_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentAsset", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_assets_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_assets_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UpdatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_assets_users_updated_by"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("VerifiedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_assets_users_verified_by"); b.HasOne("Tiku.Domain.Catalog.Category", null) .WithMany() .HasForeignKey("TenantId", "CategoryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_assets_categories_tenant_id_category_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_assets_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_assets_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_assets_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_entries_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_entries_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UpdatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_entries_users_updated_by"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_entries_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportIssue", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_import_issues_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentImportItem", null) .WithMany() .HasForeignKey("TenantId", "ItemId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_content_import_issues_content_import_items_tenant_id_item_id"); b.HasOne("Tiku.Domain.Content.ContentImportJob", null) .WithMany() .HasForeignKey("TenantId", "JobId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_import_issues_content_import_jobs_tenant_id_job_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportItem", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_import_items_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentImportJob", null) .WithMany() .HasForeignKey("TenantId", "JobId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_import_items_content_import_jobs_tenant_id_job_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentImportJob", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_import_jobs_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_import_jobs_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Category", null) .WithMany() .HasForeignKey("TenantId", "TargetCategoryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_import_jobs_categories_tenant_id_target_category_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "TargetContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_import_jobs_content_nodes_tenant_id_target_content_~"); b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null) .WithMany() .HasForeignKey("TenantId", "TargetQuestionBankId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_import_jobs_question_banks_tenant_id_target_questio~"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "TargetRegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_import_jobs_regions_tenant_id_target_region_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "TargetSubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_import_jobs_subjects_tenant_id_target_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ContentNode", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_nodes_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_nodes_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UpdatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_content_nodes_users_updated_by"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_content_nodes_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ParentId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_content_nodes_content_nodes_tenant_id_parent_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_content_nodes_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookChapter", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_handbook_chapters_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_chapters_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_chapters_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Content.HandbookSubject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_handbook_chapters_handbook_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookEntry", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_handbook_entries_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.HandbookChapter", null) .WithMany() .HasForeignKey("TenantId", "ChapterId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_handbook_entries_handbook_chapters_tenant_id_chapter_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_entries_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_entries_content_entries_tenant_id_entry_id"); }); modelBuilder.Entity("Tiku.Domain.Content.HandbookSubject", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_handbook_subjects_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_subjects_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_subjects_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Catalog.Major", null) .WithMany() .HasForeignKey("TenantId", "MajorId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_subjects_majors_tenant_id_major_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_subjects_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.School", null) .WithMany() .HasForeignKey("TenantId", "SchoolId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_handbook_subjects_schools_tenant_id_school_id"); }); modelBuilder.Entity("Tiku.Domain.Content.ImageAsset", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_images_tenants_tenant_id"); }); modelBuilder.Entity("Tiku.Domain.Content.PracticeBlueprint", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_practice_blueprints_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_practice_blueprints_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UpdatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_practice_blueprints_users_updated_by"); b.HasOne("Tiku.Domain.Content.QuestionCollection", null) .WithMany() .HasForeignKey("TenantId", "CollectionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_blueprints_question_collections_tenant_id_collecti~"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_blueprints_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "NodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_blueprints_content_nodes_tenant_id_node_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_blueprints_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_question_collections_users_created_by"); b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_collections_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UpdatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_question_collections_users_updated_by"); b.HasOne("Tiku.Domain.Catalog.Category", null) .WithMany() .HasForeignKey("TenantId", "CategoryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_categories_tenant_id_category_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "NodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_content_nodes_tenant_id_node_id"); b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null) .WithMany() .HasForeignKey("TenantId", "QuestionBankId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_question_banks_tenant_id_question_bank~"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_collections_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionCollectionItem", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_collection_items_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.QuestionCollection", null) .WithMany() .HasForeignKey("TenantId", "CollectionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_collection_items_question_collections_tenant_id_co~"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_collection_items_questions_tenant_id_question_id"); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionTypeGroup", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_type_groups_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_question_type_groups_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.QuestionVideo", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_videos_tenants_tenant_id"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_question_videos_questions_tenant_id_question_id"); b.HasOne("Tiku.Domain.Content.VideoExplanation", null) .WithMany() .HasForeignKey("TenantId", "VideoId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_question_videos_video_explanations_tenant_id_video_id"); }); modelBuilder.Entity("Tiku.Domain.Content.SubjectShare", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_subject_shares_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SourceSubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_subject_shares_subjects_tenant_id_source_subject_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "TargetSubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_subject_shares_subjects_tenant_id_target_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_favorites_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_favorites_users_user_id"); b.HasOne("Tiku.Domain.Content.VocabularyWord", null) .WithMany() .HasForeignKey("TenantId", "WordId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_favorites_vocabulary_words_tenant_id_word_id"); }); modelBuilder.Entity("Tiku.Domain.Content.UserWordProgress", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_progress_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_progress_users_user_id"); b.HasOne("Tiku.Domain.Content.VocabularyWord", null) .WithMany() .HasForeignKey("TenantId", "WordId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_word_progress_vocabulary_words_tenant_id_word_id"); }); modelBuilder.Entity("Tiku.Domain.Content.VideoExplanation", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_video_explanations_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_video_explanations_subjects_tenant_id_subject_id"); }); modelBuilder.Entity("Tiku.Domain.Content.VocabularyUnit", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_vocabulary_units_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_units_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_units_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_units_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.Content.VocabularyWord", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_vocabulary_words_tenants_tenant_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_words_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_words_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Content.VocabularyUnit", null) .WithMany() .HasForeignKey("TenantId", "UnitId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_vocabulary_words_vocabulary_units_tenant_id_unit_id"); }); modelBuilder.Entity("Tiku.Domain.Identity.StudentProfile", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_student_profiles_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_student_profiles_users_user_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_student_profiles_regions_tenant_id_region_id"); b.HasOne("Tiku.Domain.Catalog.Major", null) .WithMany() .HasForeignKey("TenantId", "SelectedMajorId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_student_profiles_majors_tenant_id_selected_major_id"); b.HasOne("Tiku.Domain.Catalog.School", null) .WithMany() .HasForeignKey("TenantId", "SelectedSchoolId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_student_profiles_schools_tenant_id_selected_school_id"); }); modelBuilder.Entity("Tiku.Domain.Identity.UserIdentity", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_user_identities_users_user_id"); }); modelBuilder.Entity("Tiku.Domain.Learning.AnswerRecord", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_answer_records_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_answer_records_users_user_id"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_answer_records_questions_tenant_id_question_id"); b.HasOne("Tiku.Domain.QuestionBanks.QuestionVersion", null) .WithMany() .HasForeignKey("TenantId", "QuestionId", "QuestionVersionId") .HasPrincipalKey("TenantId", "QuestionId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_answer_records_question_versions_tenant_id_question_id_ques~"); b.HasOne("Tiku.Domain.Learning.PracticeSession", null) .WithMany() .HasForeignKey("TenantId", "UserId", "PracticeSessionId") .HasPrincipalKey("TenantId", "UserId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_answer_records_practice_sessions_tenant_id_user_id_practice~"); }); modelBuilder.Entity("Tiku.Domain.Learning.FavoriteQuestion", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_favorite_questions_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_favorite_questions_users_user_id"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_favorite_questions_questions_tenant_id_question_id"); }); modelBuilder.Entity("Tiku.Domain.Learning.PracticeSession", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_practice_sessions_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_practice_sessions_users_user_id"); b.HasOne("Tiku.Domain.Content.PracticeBlueprint", null) .WithMany() .HasForeignKey("TenantId", "BlueprintId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_sessions_practice_blueprints_tenant_id_blueprint_id"); b.HasOne("Tiku.Domain.Content.QuestionCollection", null) .WithMany() .HasForeignKey("TenantId", "CollectionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_sessions_question_collections_tenant_id_collection~"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_sessions_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_practice_sessions_content_entries_tenant_id_entry_id"); }); modelBuilder.Entity("Tiku.Domain.Learning.RecentPractice", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_recent_practices_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("fk_recent_practices_users_user_id"); }); modelBuilder.Entity("Tiku.Domain.Learning.WrongQuestion", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_wrong_questions_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_wrong_questions_users_user_id"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_wrong_questions_questions_tenant_id_question_id"); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.Question", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_questions_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Category", null) .WithMany() .HasForeignKey("TenantId", "CategoryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_categories_tenant_id_category_id"); b.HasOne("Tiku.Domain.Content.ContentNode", null) .WithMany() .HasForeignKey("TenantId", "ContentNodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_content_nodes_tenant_id_content_node_id"); b.HasOne("Tiku.Domain.Content.ContentEntry", null) .WithMany() .HasForeignKey("TenantId", "EntryId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_content_entries_tenant_id_entry_id"); b.HasOne("Tiku.Domain.Catalog.ModuleNode", null) .WithMany() .HasForeignKey("TenantId", "NodeId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_module_nodes_tenant_id_node_id"); b.HasOne("Tiku.Domain.Content.QuestionCollection", null) .WithMany() .HasForeignKey("TenantId", "PrimaryCollectionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_question_collections_tenant_id_primary_collection~"); b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null) .WithMany() .HasForeignKey("TenantId", "QuestionBankId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_question_banks_tenant_id_question_bank_id"); b.HasOne("Tiku.Domain.Catalog.Subject", null) .WithMany() .HasForeignKey("TenantId", "SubjectId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_subjects_tenant_id_subject_id"); b.HasOne("Tiku.Domain.QuestionBanks.QuestionVersion", null) .WithMany() .HasForeignKey("TenantId", "Id", "CurrentVersionId") .HasPrincipalKey("TenantId", "QuestionId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_questions_question_versions_tenant_id_id_current_version_id"); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionBank", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_banks_tenants_tenant_id"); b.HasOne("Tiku.Domain.Catalog.Region", null) .WithMany() .HasForeignKey("TenantId", "RegionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("fk_question_banks_regions_tenant_id_region_id"); }); modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionVersion", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("CreatedBy") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_question_versions_users_created_by"); b.HasOne("Tiku.Domain.QuestionBanks.Question", null) .WithMany() .HasForeignKey("TenantId", "QuestionId") .HasPrincipalKey("TenantId", "Id") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_question_versions_questions_tenant_id_question_id"); }); modelBuilder.Entity("Tiku.Domain.Tenancy.Tenant", b => { b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("OwnerUserId") .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("fk_tenants_users_owner_user_id"); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantBranding", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithOne() .HasForeignKey("Tiku.Domain.Tenancy.TenantBranding", "TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_tenant_branding_tenants_tenant_id"); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantDomain", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_tenant_domains_tenants_tenant_id"); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantMembership", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_tenant_memberships_tenants_tenant_id"); b.HasOne("Tiku.Domain.Identity.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_tenant_memberships_users_user_id"); }); modelBuilder.Entity("Tiku.Domain.Tenancy.TenantSettings", b => { b.HasOne("Tiku.Domain.Tenancy.Tenant", null) .WithOne() .HasForeignKey("Tiku.Domain.Tenancy.TenantSettings", "TenantId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .HasConstraintName("fk_tenant_settings_tenants_tenant_id"); }); #pragma warning restore 612, 618 } } }