feat: add phase five operations foundation

This commit is contained in:
2026-07-28 09:57:50 +08:00
parent 71793a2de0
commit f22f329d33
39 changed files with 4810 additions and 160 deletions

View File

@@ -9876,6 +9876,268 @@ namespace Tiku.Infrastructure.Persistence.Migrations
b.ToTable("audit_logs", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.BackendMenu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("Area")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("area");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("code");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("Icon")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("icon");
b.Property<bool>("IsActive")
.HasColumnType("boolean")
.HasColumnName("is_active");
b.Property<string>("ParentCode")
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("parent_code");
b.Property<string>("Path")
.HasMaxLength(1024)
.HasColumnType("character varying(1024)")
.HasColumnName("path");
b.Property<string>("PermissionCode")
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("permission_code");
b.Property<int>("SortOrder")
.HasColumnType("integer")
.HasColumnName("sort_order");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("title");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.HasKey("Id")
.HasName("pk_backend_menus");
b.HasAlternateKey("Code")
.HasName("ak_backend_menus_code");
b.HasIndex("Code")
.IsUnique()
.HasDatabaseName("ix_backend_menus_code");
b.HasIndex("PermissionCode")
.HasDatabaseName("ix_backend_menus_permission_code");
b.HasIndex("Area", "ParentCode", "SortOrder")
.HasDatabaseName("ix_backend_menus_area_parent_code_sort_order");
b.ToTable("backend_menus", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.BackendPermission", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("Area")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("area");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("code");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("Description")
.HasMaxLength(1000)
.HasColumnType("character varying(1000)")
.HasColumnName("description");
b.Property<bool>("IsSystem")
.HasColumnType("boolean")
.HasColumnName("is_system");
b.Property<string>("Module")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("module");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("name");
b.Property<int>("SortOrder")
.HasColumnType("integer")
.HasColumnName("sort_order");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.HasKey("Id")
.HasName("pk_backend_permissions");
b.HasAlternateKey("Code")
.HasName("ak_backend_permissions_code");
b.HasIndex("Code")
.IsUnique()
.HasDatabaseName("ix_backend_permissions_code");
b.HasIndex("Area", "Module", "SortOrder")
.HasDatabaseName("ix_backend_permissions_area_module_sort_order");
b.ToTable("backend_permissions", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.BackgroundJob", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset?>("CompletedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("completed_at");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("JobType")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("job_type");
b.Property<string>("LastError")
.HasMaxLength(4000)
.HasColumnType("character varying(4000)")
.HasColumnName("last_error");
b.Property<DateTimeOffset?>("LockExpiresAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("lock_expires_at");
b.Property<string>("LockedBy")
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("locked_by");
b.Property<int>("MaxRetries")
.HasColumnType("integer")
.HasColumnName("max_retries");
b.Property<Guid?>("OutputAssetId")
.HasColumnType("uuid")
.HasColumnName("output_asset_id");
b.Property<JsonElement>("Payload")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("payload")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<JsonElement>("Result")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("result")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<int>("RetryCount")
.HasColumnType("integer")
.HasColumnName("retry_count");
b.Property<DateTimeOffset?>("RunAfter")
.HasColumnType("timestamp with time zone")
.HasColumnName("run_after");
b.Property<DateTimeOffset?>("StartedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("started_at");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.HasKey("Id")
.HasName("pk_background_jobs");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_background_jobs_tenant_id_id");
b.HasIndex("TenantId", "OutputAssetId")
.HasDatabaseName("ix_background_jobs_tenant_id_output_asset_id");
b.HasIndex("TenantId", "JobType", "Status", "CreatedAt")
.HasDatabaseName("ix_background_jobs_tenant_id_job_type_status_created_at");
b.HasIndex("TenantId", "Status", "RunAfter", "CreatedAt")
.HasDatabaseName("ix_background_jobs_tenant_id_status_run_after_created_at");
b.ToTable("background_jobs", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.Badge", b =>
{
b.Property<Guid>("Id")
@@ -10135,6 +10397,381 @@ namespace Tiku.Infrastructure.Persistence.Migrations
b.ToTable("faqs", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendRole", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("code");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("Description")
.HasMaxLength(1000)
.HasColumnType("character varying(1000)")
.HasColumnName("description");
b.Property<bool>("IsSystem")
.HasColumnType("boolean")
.HasColumnName("is_system");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("name");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.HasKey("Id")
.HasName("pk_platform_backend_roles");
b.HasIndex("Code")
.IsUnique()
.HasDatabaseName("ix_platform_backend_roles_code");
b.HasIndex("Status", "Code")
.HasDatabaseName("ix_platform_backend_roles_status_code");
b.ToTable("platform_backend_roles", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendRoleMenu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("MenuCode")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("menu_code");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.HasKey("Id")
.HasName("pk_platform_backend_role_menus");
b.HasIndex("MenuCode")
.HasDatabaseName("ix_platform_backend_role_menus_menu_code");
b.HasIndex("RoleId", "MenuCode")
.IsUnique()
.HasDatabaseName("ix_platform_backend_role_menus_role_id_menu_code");
b.ToTable("platform_backend_role_menus", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendRolePermission", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("PermissionCode")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("permission_code");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.HasKey("Id")
.HasName("pk_platform_backend_role_permissions");
b.HasIndex("PermissionCode")
.HasDatabaseName("ix_platform_backend_role_permissions_permission_code");
b.HasIndex("RoleId", "PermissionCode")
.IsUnique()
.HasDatabaseName("ix_platform_backend_role_permissions_role_id_permission_code");
b.ToTable("platform_backend_role_permissions", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendUserRole", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id")
.HasName("pk_platform_backend_user_roles");
b.HasIndex("RoleId")
.HasDatabaseName("ix_platform_backend_user_roles_role_id");
b.HasIndex("UserId", "RoleId")
.IsUnique()
.HasDatabaseName("ix_platform_backend_user_roles_user_id_role_id");
b.ToTable("platform_backend_user_roles", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRole", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("code");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<JsonElement>("DataScope")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("data_scope")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("Description")
.HasMaxLength(1000)
.HasColumnType("character varying(1000)")
.HasColumnName("description");
b.Property<bool>("IsSystem")
.HasColumnType("boolean")
.HasColumnName("is_system");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("name");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.HasKey("Id")
.HasName("pk_tenant_backend_roles");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_tenant_backend_roles_tenant_id_id");
b.HasIndex("TenantId", "Code")
.IsUnique()
.HasDatabaseName("ix_tenant_backend_roles_tenant_id_code");
b.HasIndex("TenantId", "Status", "Code")
.HasDatabaseName("ix_tenant_backend_roles_tenant_id_status_code");
b.ToTable("tenant_backend_roles", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRoleMenu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("MenuCode")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("menu_code");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.HasKey("Id")
.HasName("pk_tenant_backend_role_menus");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_tenant_backend_role_menus_tenant_id_id");
b.HasIndex("MenuCode")
.HasDatabaseName("ix_tenant_backend_role_menus_menu_code");
b.HasIndex("TenantId", "RoleId", "MenuCode")
.IsUnique()
.HasDatabaseName("ix_tenant_backend_role_menus_tenant_id_role_id_menu_code");
b.ToTable("tenant_backend_role_menus", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRolePermission", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("PermissionCode")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)")
.HasColumnName("permission_code");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.HasKey("Id")
.HasName("pk_tenant_backend_role_permissions");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_tenant_backend_role_permissions_tenant_id_id");
b.HasIndex("PermissionCode")
.HasDatabaseName("ix_tenant_backend_role_permissions_permission_code");
b.HasIndex("TenantId", "RoleId", "PermissionCode")
.IsUnique()
.HasDatabaseName("ix_tenant_backend_role_permissions_tenant_id_role_id_permissio~");
b.ToTable("tenant_backend_role_permissions", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendUserRole", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<Guid>("RoleId")
.HasColumnType("uuid")
.HasColumnName("role_id");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id")
.HasName("pk_tenant_backend_user_roles");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_tenant_backend_user_roles_tenant_id_id");
b.HasIndex("UserId")
.HasDatabaseName("ix_tenant_backend_user_roles_user_id");
b.HasIndex("TenantId", "RoleId")
.HasDatabaseName("ix_tenant_backend_user_roles_tenant_id_role_id");
b.HasIndex("TenantId", "UserId", "RoleId")
.IsUnique()
.HasDatabaseName("ix_tenant_backend_user_roles_tenant_id_user_id_role_id");
b.ToTable("tenant_backend_user_roles", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantContentNotification", b =>
{
b.Property<Guid>("Id")
@@ -15991,6 +16628,33 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_audit_logs_tenants_tenant_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.BackendMenu", b =>
{
b.HasOne("Tiku.Domain.Operations.BackendPermission", null)
.WithMany()
.HasForeignKey("PermissionCode")
.HasPrincipalKey("Code")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_backend_menus_backend_permissions_permission_code");
});
modelBuilder.Entity("Tiku.Domain.Operations.BackgroundJob", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_background_jobs_tenants_tenant_id");
b.HasOne("Tiku.Domain.Content.ContentAsset", null)
.WithMany()
.HasForeignKey("TenantId", "OutputAssetId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_background_jobs_content_assets_tenant_id_output_asset_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.Badge", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
@@ -16035,6 +16699,125 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_faqs_regions_tenant_id_region_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendRoleMenu", b =>
{
b.HasOne("Tiku.Domain.Operations.BackendMenu", null)
.WithMany()
.HasForeignKey("MenuCode")
.HasPrincipalKey("Code")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired()
.HasConstraintName("fk_platform_backend_role_menus_backend_menus_menu_code");
b.HasOne("Tiku.Domain.Operations.PlatformBackendRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_platform_backend_role_menus_platform_backend_roles_role_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendRolePermission", b =>
{
b.HasOne("Tiku.Domain.Operations.BackendPermission", null)
.WithMany()
.HasForeignKey("PermissionCode")
.HasPrincipalKey("Code")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired()
.HasConstraintName("fk_platform_backend_role_permissions_backend_permissions_permi~");
b.HasOne("Tiku.Domain.Operations.PlatformBackendRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_platform_backend_role_permissions_platform_backend_roles_ro~");
});
modelBuilder.Entity("Tiku.Domain.Operations.PlatformBackendUserRole", b =>
{
b.HasOne("Tiku.Domain.Operations.PlatformBackendRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_platform_backend_user_roles_platform_backend_roles_role_id");
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_platform_backend_user_roles_users_user_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRole", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_backend_roles_tenants_tenant_id");
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRoleMenu", b =>
{
b.HasOne("Tiku.Domain.Operations.BackendMenu", null)
.WithMany()
.HasForeignKey("MenuCode")
.HasPrincipalKey("Code")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired()
.HasConstraintName("fk_tenant_backend_role_menus_backend_menus_menu_code");
b.HasOne("Tiku.Domain.Operations.TenantBackendRole", null)
.WithMany()
.HasForeignKey("TenantId", "RoleId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_backend_role_menus_tenant_backend_roles_tenant_id_ro~");
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendRolePermission", b =>
{
b.HasOne("Tiku.Domain.Operations.BackendPermission", null)
.WithMany()
.HasForeignKey("PermissionCode")
.HasPrincipalKey("Code")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired()
.HasConstraintName("fk_tenant_backend_role_permissions_backend_permissions_permiss~");
b.HasOne("Tiku.Domain.Operations.TenantBackendRole", null)
.WithMany()
.HasForeignKey("TenantId", "RoleId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_backend_role_permissions_tenant_backend_roles_tenant~");
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantBackendUserRole", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_backend_user_roles_users_user_id");
b.HasOne("Tiku.Domain.Operations.TenantBackendRole", null)
.WithMany()
.HasForeignKey("TenantId", "RoleId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_backend_user_roles_tenant_backend_roles_tenant_id_ro~");
});
modelBuilder.Entity("Tiku.Domain.Operations.TenantContentNotification", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)