diff --git a/Pf2eModel/Migrations/20250418083111_1.Designer.cs b/Pf2eModel/Migrations/20250418083111_1.Designer.cs
new file mode 100644
index 0000000..6ee5aaa
--- /dev/null
+++ b/Pf2eModel/Migrations/20250418083111_1.Designer.cs
@@ -0,0 +1,2054 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Pf2eModel.Model;
+using Pf2eModel.Model.Enum;
+
+#nullable disable
+
+namespace Pf2eModel.Migrations
+{
+ [DbContext(typeof(Pf2eDbContext))]
+ [Migration("20250418083111_1")]
+ partial class _1
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.4")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "offensive", "defensive", "interaction", "familiar", "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_type", new[] { "none", "1_action", "2_actions", "3_actions", "1-3_actions", "1-2_actions" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "alias_type", new[] { "legacy", "english", "legacy_english", "hobby", "other" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "darkvision" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "any", "str", "dex", "con", "int", "wis", "cha" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "unknown", "senses", "abilities", "death", "attitudes", "detection" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestryfeature", "classfeature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign_feature" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "med", "tiny" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "society" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_stage", new[] { "untrained", "trained", "expert", "master", "legendary" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "tradition" });
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("DeityTraining", b =>
+ {
+ b.Property("DeityId")
+ .HasColumnType("integer")
+ .HasColumnName("deity_id");
+
+ b.Property("SkillsId")
+ .HasColumnType("integer")
+ .HasColumnName("skills_id");
+
+ b.HasKey("DeityId", "SkillsId")
+ .HasName("pk_deity_training");
+
+ b.HasIndex("SkillsId")
+ .HasDatabaseName("ix_deity_training_skills_id");
+
+ b.ToTable("deity_training", (string)null);
+ });
+
+ modelBuilder.Entity("EntityKeyword", b =>
+ {
+ b.Property("EntitiesId")
+ .HasColumnType("integer")
+ .HasColumnName("entities_id");
+
+ b.Property("KeywordsId")
+ .HasColumnType("integer")
+ .HasColumnName("keywords_id");
+
+ b.HasKey("EntitiesId", "KeywordsId")
+ .HasName("pk_entity_keyword");
+
+ b.HasIndex("KeywordsId")
+ .HasDatabaseName("ix_entity_keyword_keywords_id");
+
+ b.ToTable("entity_keyword", (string)null);
+ });
+
+ modelBuilder.Entity("EntityTrait", b =>
+ {
+ b.Property("EntitiesId")
+ .HasColumnType("integer")
+ .HasColumnName("entities_id");
+
+ b.Property("TraitsId")
+ .HasColumnType("integer")
+ .HasColumnName("traits_id");
+
+ b.HasKey("EntitiesId", "TraitsId")
+ .HasName("pk_entity_trait");
+
+ b.HasIndex("TraitsId")
+ .HasDatabaseName("ix_entity_trait_traits_id");
+
+ b.ToTable("entity_trait", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Entity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("description")
+ .HasColumnOrder(6)
+ .HasComment("Текстовое описание объекта");
+
+ b.Property("Img")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("img")
+ .HasColumnOrder(5)
+ .HasComment("Изображение объекта");
+
+ b.Property("IsChecked")
+ .HasColumnType("boolean")
+ .HasColumnName("is_checked")
+ .HasColumnOrder(9)
+ .HasComment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи");
+
+ b.Property("IsTranslated")
+ .HasColumnType("boolean")
+ .HasColumnName("is_translated")
+ .HasColumnOrder(8)
+ .HasComment("Флаг, указывающий, что у объекта существует перевод");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasColumnOrder(2)
+ .HasComment("Отображаемое имя");
+
+ b.Property("Rarity")
+ .HasColumnType("entity_rarity")
+ .HasColumnName("rarity")
+ .HasColumnOrder(7);
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("slug")
+ .HasColumnOrder(4)
+ .HasComment("Часть имени в URL");
+
+ b.Property("Type")
+ .HasColumnType("entity_type")
+ .HasColumnName("type")
+ .HasColumnOrder(3)
+ .HasComment("Тип объекта");
+
+ b.HasKey("Id")
+ .HasName("pk_entities");
+
+ b.ToTable("entities", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.EntityAlias", b =>
+ {
+ b.Property("EntityId")
+ .HasColumnType("integer")
+ .HasColumnName("entity_id")
+ .HasColumnOrder(1);
+
+ b.Property("Type")
+ .HasColumnType("alias_type")
+ .HasColumnName("type")
+ .HasColumnOrder(2);
+
+ b.Property("Alias")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("alias")
+ .HasColumnOrder(3);
+
+ b.HasKey("EntityId", "Type")
+ .HasName("pk_entity_aliases");
+
+ b.ToTable("entity_aliases", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Keywords.Keyword", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("slug")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_keywords");
+
+ b.ToTable("keywords", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Keywords.KeywordAlias", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("KeywordId")
+ .HasColumnType("integer")
+ .HasColumnName("keyword_id")
+ .HasColumnOrder(2);
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("value")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_keyword_aliases");
+
+ b.HasIndex("KeywordId")
+ .HasDatabaseName("ix_keyword_aliases_keyword_id");
+
+ b.ToTable("keyword_aliases", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Source.EntitySource", b =>
+ {
+ b.Property("EntityId")
+ .HasColumnType("integer")
+ .HasColumnName("entity_id")
+ .HasColumnOrder(1);
+
+ b.Property("SourceId")
+ .HasColumnType("integer")
+ .HasColumnName("source_id")
+ .HasColumnOrder(2);
+
+ b.Property("IsRemaster")
+ .HasColumnType("boolean")
+ .HasColumnName("is_remaster")
+ .HasColumnOrder(4)
+ .HasComment("Флаг, указывающий, что объект является частью ремастера");
+
+ b.Property("Suffix")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("suffix")
+ .HasColumnOrder(3)
+ .HasComment("Номер страницы, эррата и т.д.");
+
+ b.HasKey("EntityId", "SourceId")
+ .HasName("pk_entity_sources");
+
+ b.HasIndex("SourceId")
+ .HasDatabaseName("ix_entity_sources_source_id");
+
+ b.ToTable("entity_sources", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Source.Source", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Category")
+ .HasColumnType("source_category")
+ .HasColumnName("category")
+ .HasColumnOrder(3);
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasColumnOrder(2);
+
+ b.Property("ReleaseDate")
+ .HasColumnType("date")
+ .HasColumnName("release_date")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_sources");
+
+ b.ToTable("sources", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Targets.EntityExternal", b =>
+ {
+ b.Property("EntityId")
+ .HasColumnType("integer")
+ .HasColumnName("entity_id")
+ .HasColumnOrder(0);
+
+ b.Property("TargetId")
+ .HasColumnType("integer")
+ .HasColumnName("target_id")
+ .HasColumnOrder(1);
+
+ b.Property("Md5")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("md5")
+ .HasColumnOrder(3)
+ .HasComment("Контроль версии объекта");
+
+ b.Property("Suffix")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("suffix")
+ .HasColumnOrder(2)
+ .HasComment("Часть URL до объекта. Для источников Foundry - полный UUID объекта");
+
+ b.HasKey("EntityId", "TargetId")
+ .HasName("pk_entity_externals");
+
+ b.HasIndex("TargetId")
+ .HasDatabaseName("ix_entity_externals_target_id");
+
+ b.ToTable("entity_externals", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Targets.ExternalTarget", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Icon")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("icon")
+ .HasColumnOrder(3);
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasColumnOrder(2);
+
+ b.Property("Prefix")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("prefix")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_external_targets");
+
+ b.ToTable("external_targets", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Common.Frequency", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Max")
+ .HasColumnType("integer")
+ .HasColumnName("max")
+ .HasColumnOrder(2);
+
+ b.Property("Per")
+ .HasColumnType("integer")
+ .HasColumnName("per")
+ .HasColumnOrder(3);
+
+ b.Property("Value")
+ .HasColumnType("integer")
+ .HasColumnName("value")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_frequencies");
+
+ b.ToTable("frequencies", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Common.Language", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasColumnOrder(2);
+
+ b.Property("Rarity")
+ .HasColumnType("entity_rarity")
+ .HasColumnName("rarity")
+ .HasColumnOrder(4);
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("slug")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_languages");
+
+ b.ToTable("languages", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Common.Training", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("key")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_trainings");
+
+ b.ToTable("trainings", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Action", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Actions")
+ .HasColumnType("integer")
+ .HasColumnName("actions")
+ .HasColumnOrder(3);
+
+ b.Property("Extra")
+ .HasColumnType("text")
+ .HasColumnName("extra")
+ .HasColumnOrder(6);
+
+ b.Property("IsFreeAction")
+ .HasColumnType("boolean")
+ .HasColumnName("is_free_action")
+ .HasColumnOrder(6);
+
+ b.Property("IsPassive")
+ .HasColumnType("boolean")
+ .HasColumnName("is_passive")
+ .HasColumnOrder(6);
+
+ b.Property("IsReaction")
+ .HasColumnType("boolean")
+ .HasColumnName("is_reaction")
+ .HasColumnOrder(5);
+
+ b.Property("MaxActions")
+ .HasColumnType("integer")
+ .HasColumnName("max_actions")
+ .HasColumnOrder(4);
+
+ b.Property("Type")
+ .HasColumnType("action_type")
+ .HasColumnName("type")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_actions");
+
+ b.ToTable("actions", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Ancestry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Hp")
+ .HasColumnType("integer")
+ .HasColumnName("hp")
+ .HasColumnOrder(3);
+
+ b.Property("Reach")
+ .HasColumnType("integer")
+ .HasColumnName("reach")
+ .HasColumnOrder(4);
+
+ b.Property("Size")
+ .HasColumnType("size")
+ .HasColumnName("size")
+ .HasColumnOrder(2);
+
+ b.Property("Speed")
+ .HasColumnType("integer")
+ .HasColumnName("speed")
+ .HasColumnOrder(5);
+
+ b.Property("Vision")
+ .HasColumnType("ancestry_vision")
+ .HasColumnName("vision")
+ .HasColumnOrder(6);
+
+ b.HasKey("Id")
+ .HasName("pk_ancestries");
+
+ b.ToTable("ancestries", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryBoost", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AncestryId")
+ .HasColumnType("integer")
+ .HasColumnName("ancestry_id")
+ .HasColumnOrder(2);
+
+ b.Property("Boost")
+ .HasColumnType("boolean")
+ .HasColumnName("boost")
+ .HasColumnOrder(3);
+
+ b.Property("Value")
+ .HasColumnType("attribute_values")
+ .HasColumnName("value")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_ancestry_boosts");
+
+ b.HasIndex("AncestryId")
+ .HasDatabaseName("ix_ancestry_boosts_ancestry_id");
+
+ b.ToTable("ancestry_boosts", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryItem", b =>
+ {
+ b.Property("AncestryId")
+ .HasColumnType("integer")
+ .HasColumnName("ancestry_id")
+ .HasColumnOrder(1);
+
+ b.Property("ItemId")
+ .HasColumnType("integer")
+ .HasColumnName("item_id")
+ .HasColumnOrder(2);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(3);
+
+ b.HasKey("AncestryId", "ItemId")
+ .HasName("pk_ancestry_items");
+
+ b.HasIndex("ItemId")
+ .HasDatabaseName("ix_ancestry_items_item_id");
+
+ b.ToTable("ancestry_items", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryLanguage", b =>
+ {
+ b.Property("AncestryId")
+ .HasColumnType("integer")
+ .HasColumnName("ancestry_id")
+ .HasColumnOrder(1);
+
+ b.Property("LanguageId")
+ .HasColumnType("integer")
+ .HasColumnName("language_id")
+ .HasColumnOrder(2);
+
+ b.Property("IsAdditional")
+ .HasColumnType("boolean")
+ .HasColumnName("is_additional")
+ .HasColumnOrder(3);
+
+ b.HasKey("AncestryId", "LanguageId")
+ .HasName("pk_ancestry_languages");
+
+ b.HasIndex("LanguageId")
+ .HasDatabaseName("ix_ancestry_languages_language_id");
+
+ b.ToTable("ancestry_languages", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.HasKey("Id")
+ .HasName("pk_backgrounds");
+
+ b.ToTable("backgrounds", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundBoost", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Attribute")
+ .HasColumnType("attribute_values")
+ .HasColumnName("attribute")
+ .HasColumnOrder(3);
+
+ b.Property("BackgroundId")
+ .HasColumnType("integer")
+ .HasColumnName("background_id")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_background_boosts");
+
+ b.HasIndex("BackgroundId")
+ .HasDatabaseName("ix_background_boosts_background_id");
+
+ b.ToTable("background_boosts", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundItem", b =>
+ {
+ b.Property("BackgroundId")
+ .HasColumnType("integer")
+ .HasColumnName("background_id")
+ .HasColumnOrder(1);
+
+ b.Property("EntityId")
+ .HasColumnType("integer")
+ .HasColumnName("entity_id")
+ .HasColumnOrder(2);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(3);
+
+ b.HasKey("BackgroundId", "EntityId")
+ .HasName("pk_background_items");
+
+ b.HasIndex("EntityId")
+ .HasDatabaseName("ix_background_items_entity_id");
+
+ b.ToTable("background_items", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundTraining", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("BackgroundId")
+ .HasColumnType("integer")
+ .HasColumnName("background_id")
+ .HasColumnOrder(2);
+
+ b.Property("Level")
+ .HasColumnType("training_stage")
+ .HasColumnName("level")
+ .HasColumnOrder(4);
+
+ b.Property("TrainingId")
+ .HasColumnType("integer")
+ .HasColumnName("training_id")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_background_skills");
+
+ b.HasIndex("BackgroundId")
+ .HasDatabaseName("ix_background_skills_background_id");
+
+ b.HasIndex("TrainingId")
+ .HasDatabaseName("ix_background_skills_training_id");
+
+ b.ToTable("background_skills", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Class", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("AdditionalTrainedSkills")
+ .HasColumnType("integer")
+ .HasColumnName("additional_trained_skills")
+ .HasColumnOrder(6);
+
+ b.Property("Hp")
+ .HasColumnType("integer")
+ .HasColumnName("hp")
+ .HasColumnOrder(3);
+
+ b.Property("Perception")
+ .HasColumnType("integer")
+ .HasColumnName("perception")
+ .HasColumnOrder(4);
+
+ b.Property("Spellcasting")
+ .HasColumnType("boolean")
+ .HasColumnName("spellcasting")
+ .HasColumnOrder(5);
+
+ b.HasKey("Id")
+ .HasName("pk_classes");
+
+ b.ToTable("classes", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassKeyAbility", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClassId")
+ .HasColumnType("integer")
+ .HasColumnName("class_id")
+ .HasColumnOrder(2);
+
+ b.Property("Value")
+ .HasColumnType("attribute_values")
+ .HasColumnName("value")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_class_key_abilities");
+
+ b.HasIndex("ClassId")
+ .HasDatabaseName("ix_class_key_abilities_class_id");
+
+ b.ToTable("class_key_abilities", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassProgression", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClassId")
+ .HasColumnType("integer")
+ .HasColumnName("class_id")
+ .HasColumnOrder(2);
+
+ b.Property("EntityId")
+ .HasColumnType("integer")
+ .HasColumnName("entity_id")
+ .HasColumnOrder(5);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(31);
+
+ b.Property("Type")
+ .HasColumnType("class_progression_type")
+ .HasColumnName("type")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_class_progressions");
+
+ b.HasIndex("ClassId")
+ .HasDatabaseName("ix_class_progressions_class_id");
+
+ b.HasIndex("EntityId")
+ .HasDatabaseName("ix_class_progressions_entity_id");
+
+ b.ToTable("class_progressions", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassTraining", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClassId")
+ .HasColumnType("integer")
+ .HasColumnName("class_id")
+ .HasColumnOrder(2);
+
+ b.Property("Name")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasColumnOrder(4);
+
+ b.Property("Stage")
+ .HasColumnType("integer")
+ .HasColumnName("stage")
+ .HasColumnOrder(5);
+
+ b.Property("TrainingId")
+ .HasColumnType("integer")
+ .HasColumnName("training_id")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_class_trainings");
+
+ b.HasIndex("ClassId")
+ .HasDatabaseName("ix_class_trainings_class_id");
+
+ b.HasIndex("TrainingId")
+ .HasDatabaseName("ix_class_trainings_training_id");
+
+ b.ToTable("class_trainings", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Condition", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Extra")
+ .HasColumnType("text")
+ .HasColumnName("extra")
+ .HasColumnOrder(3);
+
+ b.Property("Group")
+ .HasColumnType("condition_group")
+ .HasColumnName("group")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_conditions");
+
+ b.ToTable("conditions", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Deity", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Category")
+ .HasColumnType("deity_category")
+ .HasColumnName("category")
+ .HasColumnOrder(2);
+
+ b.Property("Fonts")
+ .HasColumnType("deity_fonts")
+ .HasColumnName("fonts")
+ .HasColumnOrder(3);
+
+ b.Property("Sanctification")
+ .HasColumnType("deity_sanctification")
+ .HasColumnName("sanctification")
+ .HasColumnOrder(4);
+
+ b.Property("SanctificationMust")
+ .HasColumnType("boolean")
+ .HasColumnName("sanctification_must")
+ .HasColumnOrder(5);
+
+ b.HasKey("Id")
+ .HasName("pk_deities");
+
+ b.ToTable("deities", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityAttribute", b =>
+ {
+ b.Property("DeityId")
+ .HasColumnType("integer")
+ .HasColumnName("deity_id")
+ .HasColumnOrder(1);
+
+ b.Property("Attribute")
+ .HasColumnType("attribute_values")
+ .HasColumnName("attribute")
+ .HasColumnOrder(2);
+
+ b.HasKey("DeityId", "Attribute")
+ .HasName("pk_deity_attributes");
+
+ b.ToTable("deity_attributes", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityDomain", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("DeityId")
+ .HasColumnType("integer")
+ .HasColumnName("deity_id")
+ .HasColumnOrder(2);
+
+ b.Property("IsPrimary")
+ .HasColumnType("boolean")
+ .HasColumnName("is_primary")
+ .HasColumnOrder(3);
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("value")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_deity_domains");
+
+ b.HasIndex("DeityId")
+ .HasDatabaseName("ix_deity_domains_deity_id");
+
+ b.ToTable("deity_domains", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeitySpell", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("DeityId")
+ .HasColumnType("integer")
+ .HasColumnName("deity_id")
+ .HasColumnOrder(2);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(3);
+
+ b.Property("SpellId")
+ .HasColumnType("integer")
+ .HasColumnName("spell_id")
+ .HasColumnOrder(4);
+
+ b.HasKey("Id")
+ .HasName("pk_deity_spells");
+
+ b.HasIndex("DeityId")
+ .HasDatabaseName("ix_deity_spells_deity_id");
+
+ b.HasIndex("SpellId")
+ .HasDatabaseName("ix_deity_spells_spell_id");
+
+ b.ToTable("deity_spells", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityWeapon", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("DeityId")
+ .HasColumnType("integer")
+ .HasColumnName("deity_id")
+ .HasColumnOrder(2);
+
+ b.Property("Weapon")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("weapon")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_deity_weapons");
+
+ b.HasIndex("DeityId")
+ .HasDatabaseName("ix_deity_weapons_deity_id");
+
+ b.ToTable("deity_weapons", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Actions")
+ .HasColumnType("integer")
+ .HasColumnName("actions")
+ .HasColumnOrder(4);
+
+ b.Property("Category")
+ .HasColumnType("action_category")
+ .HasColumnName("category")
+ .HasColumnOrder(3);
+
+ b.Property("Extra")
+ .HasColumnType("text")
+ .HasColumnName("extra")
+ .HasColumnOrder(10);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(5);
+
+ b.Property("LevelTaken")
+ .HasColumnType("integer")
+ .HasColumnName("level_taken")
+ .HasColumnOrder(6);
+
+ b.Property("Location")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("location")
+ .HasColumnOrder(8);
+
+ b.Property("MaxTakable")
+ .HasColumnType("integer")
+ .HasColumnName("max_takable")
+ .HasColumnOrder(7);
+
+ b.Property("OnlyLevel1")
+ .HasColumnType("boolean")
+ .HasColumnName("only_level1")
+ .HasColumnOrder(9);
+
+ b.Property("Type")
+ .HasColumnType("action_type")
+ .HasColumnName("type")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_feats");
+
+ b.ToTable("feats", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.FeatRelation.FeatPrerequisite", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("FeatId")
+ .HasColumnType("integer")
+ .HasColumnName("feat_id")
+ .HasColumnOrder(2);
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("value")
+ .HasColumnOrder(3);
+
+ b.HasKey("Id")
+ .HasName("pk_feat_prerequisites");
+
+ b.HasIndex("FeatId")
+ .HasDatabaseName("ix_feat_prerequisites_feat_id");
+
+ b.ToTable("feat_prerequisites", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Heritage", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("AncestryId")
+ .HasColumnType("integer")
+ .HasColumnName("ancestry_id")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_heritages");
+
+ b.HasIndex("AncestryId")
+ .HasDatabaseName("ix_heritages_ancestry_id");
+
+ b.ToTable("heritages", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("CanHeightening")
+ .HasColumnType("boolean")
+ .HasColumnName("can_heightening")
+ .HasColumnOrder(11);
+
+ b.Property("Cost")
+ .HasColumnType("integer")
+ .HasColumnName("cost")
+ .HasColumnOrder(3);
+
+ b.Property("Counteraction")
+ .HasColumnType("boolean")
+ .HasColumnName("counteraction")
+ .HasColumnOrder(4);
+
+ b.Property("Duration")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("duration")
+ .HasColumnOrder(6);
+
+ b.Property("Level")
+ .HasColumnType("integer")
+ .HasColumnName("level")
+ .HasColumnOrder(2);
+
+ b.Property("Range")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("range")
+ .HasColumnOrder(7);
+
+ b.Property("Requirements")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("requirements")
+ .HasColumnOrder(8);
+
+ b.Property("Sustained")
+ .HasColumnType("boolean")
+ .HasColumnName("sustained")
+ .HasColumnOrder(5);
+
+ b.Property("Target")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("target")
+ .HasColumnOrder(9);
+
+ b.Property("Time")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("time")
+ .HasColumnOrder(10);
+
+ b.HasKey("Id")
+ .HasName("pk_spells");
+
+ b.ToTable("spells", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
+ {
+ b.Property("SpellId")
+ .HasColumnType("integer")
+ .HasColumnName("spell_id")
+ .HasColumnOrder(1);
+
+ b.Property("Details")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("details")
+ .HasColumnOrder(2);
+
+ b.Property("Type")
+ .HasColumnType("spell_area_type")
+ .HasColumnName("type")
+ .HasColumnOrder(3);
+
+ b.Property("Value")
+ .HasColumnType("integer")
+ .HasColumnName("value")
+ .HasColumnOrder(4);
+
+ b.HasKey("SpellId")
+ .HasName("pk_spell_areas");
+
+ b.ToTable("spell_areas", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ApplyMod")
+ .HasColumnType("boolean")
+ .HasColumnName("apply_mod")
+ .HasColumnOrder(4);
+
+ b.Property("Category")
+ .HasColumnType("spell_damage_category")
+ .HasColumnName("category")
+ .HasColumnOrder(5);
+
+ b.Property("Formula")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("formula")
+ .HasColumnOrder(6);
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("key")
+ .HasColumnOrder(3);
+
+ b.Property("Kinds")
+ .HasColumnType("spell_damage_kinds")
+ .HasColumnName("kinds")
+ .HasColumnOrder(7);
+
+ b.Property("Materials")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("materials")
+ .HasColumnOrder(8);
+
+ b.Property("SpellId")
+ .HasColumnType("integer")
+ .HasColumnName("spell_id")
+ .HasColumnOrder(2);
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("type")
+ .HasColumnOrder(9);
+
+ b.HasKey("Id")
+ .HasName("pk_spell_damages");
+
+ b.HasIndex("SpellId")
+ .HasDatabaseName("ix_spell_damages_spell_id");
+
+ b.ToTable("spell_damages", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDefense", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("IsBasic")
+ .HasColumnType("boolean")
+ .HasColumnName("is_basic")
+ .HasColumnOrder(4);
+
+ b.Property("IsPassive")
+ .HasColumnType("boolean")
+ .HasColumnName("is_passive")
+ .HasColumnOrder(3);
+
+ b.Property("SpellId")
+ .HasColumnType("integer")
+ .HasColumnName("spell_id")
+ .HasColumnOrder(2);
+
+ b.Property("Statistic")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("statistic")
+ .HasColumnOrder(5);
+
+ b.HasKey("Id")
+ .HasName("pk_spell_defenses");
+
+ b.HasIndex("SpellId")
+ .HasDatabaseName("ix_spell_defenses_spell_id");
+
+ b.ToTable("spell_defenses", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellRitual", b =>
+ {
+ b.Property("SpellId")
+ .HasColumnType("integer")
+ .HasColumnName("spell_id")
+ .HasColumnOrder(1);
+
+ b.Property("PrimaryCheck")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("primary_check")
+ .HasColumnOrder(2);
+
+ b.Property("SecondaryCasters")
+ .HasColumnType("integer")
+ .HasColumnName("secondary_casters")
+ .HasColumnOrder(3);
+
+ b.Property("SecondaryChecks")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("secondary_checks")
+ .HasColumnOrder(4);
+
+ b.HasKey("SpellId")
+ .HasName("pk_spell_rituals");
+
+ b.ToTable("spell_rituals", (string)null);
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Trait", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasColumnOrder(1);
+
+ b.Property("Type")
+ .HasColumnType("trait_type")
+ .HasColumnName("type")
+ .HasColumnOrder(2);
+
+ b.HasKey("Id")
+ .HasName("pk_traits");
+
+ b.ToTable("traits", (string)null);
+ });
+
+ modelBuilder.Entity("DeityTraining", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Deity", null)
+ .WithMany()
+ .HasForeignKey("DeityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_training_deities_deity_id");
+
+ b.HasOne("Pf2eModel.Model.Common.Training", null)
+ .WithMany()
+ .HasForeignKey("SkillsId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_training_trainings_skills_id");
+ });
+
+ modelBuilder.Entity("EntityKeyword", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", null)
+ .WithMany()
+ .HasForeignKey("EntitiesId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_keyword_entities_entities_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Keywords.Keyword", null)
+ .WithMany()
+ .HasForeignKey("KeywordsId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_keyword_keywords_keywords_id");
+ });
+
+ modelBuilder.Entity("EntityTrait", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", null)
+ .WithMany()
+ .HasForeignKey("EntitiesId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_trait_entities_entities_id");
+
+ b.HasOne("Pf2eModel.Model.Structure.Trait", null)
+ .WithMany()
+ .HasForeignKey("TraitsId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_trait_traits_traits_id");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.EntityAlias", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithMany("Aliases")
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_aliases_entities_entity_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Keywords.KeywordAlias", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Keywords.Keyword", "Keyword")
+ .WithMany("Aliases")
+ .HasForeignKey("KeywordId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_keyword_aliases_keywords_keyword_id");
+
+ b.Navigation("Keyword");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Source.EntitySource", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithMany("Sources")
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_sources_entities_entity_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Source.Source", "Source")
+ .WithMany("EntitySources")
+ .HasForeignKey("SourceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_sources_sources_source_id");
+
+ b.Navigation("Entity");
+
+ b.Navigation("Source");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Targets.EntityExternal", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithMany("Externals")
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_externals_entities_entity_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Targets.ExternalTarget", "Target")
+ .WithMany("EntityExternals")
+ .HasForeignKey("TargetId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_entity_externals_external_targets_target_id");
+
+ b.Navigation("Entity");
+
+ b.Navigation("Target");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Action", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Action", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_actions_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Ancestry", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Ancestry", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestries_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryBoost", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Ancestry", "Ancestry")
+ .WithMany("AncestryBoosts")
+ .HasForeignKey("AncestryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestry_boosts_ancestries_ancestry_id");
+
+ b.Navigation("Ancestry");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryItem", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Ancestry", "Ancestry")
+ .WithMany("AncestryItems")
+ .HasForeignKey("AncestryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestry_items_ancestries_ancestry_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Item")
+ .WithMany()
+ .HasForeignKey("ItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestry_items_entities_item_id");
+
+ b.Navigation("Ancestry");
+
+ b.Navigation("Item");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.AncestryRelation.AncestryLanguage", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Ancestry", "Ancestry")
+ .WithMany("AncestryLanguages")
+ .HasForeignKey("AncestryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestry_languages_ancestries_ancestry_id");
+
+ b.HasOne("Pf2eModel.Model.Common.Language", "Language")
+ .WithMany()
+ .HasForeignKey("LanguageId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_ancestry_languages_languages_language_id");
+
+ b.Navigation("Ancestry");
+
+ b.Navigation("Language");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Background", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_backgrounds_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundBoost", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Background", "Background")
+ .WithMany("BackgroundBoosts")
+ .HasForeignKey("BackgroundId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_background_boosts_backgrounds_background_id");
+
+ b.Navigation("Background");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundItem", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Background", "Background")
+ .WithMany("BackgroundItems")
+ .HasForeignKey("BackgroundId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_background_items_backgrounds_background_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithMany()
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_background_items_entities_entity_id");
+
+ b.Navigation("Background");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.BackgroundRelation.BackgroundTraining", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Background", "Background")
+ .WithMany("BackgroundSkills")
+ .HasForeignKey("BackgroundId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_background_skills_backgrounds_background_id");
+
+ b.HasOne("Pf2eModel.Model.Common.Training", "Training")
+ .WithMany()
+ .HasForeignKey("TrainingId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_background_skills_trainings_training_id");
+
+ b.Navigation("Background");
+
+ b.Navigation("Training");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Class", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Class", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_classes_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassKeyAbility", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Class", "Class")
+ .WithMany("ClassKeyAbilities")
+ .HasForeignKey("ClassId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_class_key_abilities_classes_class_id");
+
+ b.Navigation("Class");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassProgression", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Class", "Class")
+ .WithMany("ClassProgressions")
+ .HasForeignKey("ClassId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_class_progressions_classes_class_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithMany()
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.SetNull)
+ .HasConstraintName("fk_class_progressions_entities_entity_id");
+
+ b.Navigation("Class");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.ClassRelation.ClassTraining", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Class", "Class")
+ .WithMany("ClassTrainings")
+ .HasForeignKey("ClassId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_class_trainings_classes_class_id");
+
+ b.HasOne("Pf2eModel.Model.Common.Training", "Training")
+ .WithMany()
+ .HasForeignKey("TrainingId")
+ .OnDelete(DeleteBehavior.SetNull)
+ .HasConstraintName("fk_class_trainings_trainings_training_id");
+
+ b.Navigation("Class");
+
+ b.Navigation("Training");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Condition", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Condition", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_conditions_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Deity", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Deity", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deities_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityAttribute", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Deity", "Deity")
+ .WithMany("DeityAttributes")
+ .HasForeignKey("DeityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_attributes_deities_deity_id");
+
+ b.Navigation("Deity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityDomain", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Deity", "Deity")
+ .WithMany("DeityDomains")
+ .HasForeignKey("DeityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_domains_deities_deity_id");
+
+ b.Navigation("Deity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeitySpell", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Deity", "Deity")
+ .WithMany("DeitySpells")
+ .HasForeignKey("DeityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_spells_deities_deity_id");
+
+ b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
+ .WithMany()
+ .HasForeignKey("SpellId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_spells_spells_spell_id");
+
+ b.Navigation("Deity");
+
+ b.Navigation("Spell");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.DeityRelation.DeityWeapon", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Deity", "Deity")
+ .WithMany("DeityWeapons")
+ .HasForeignKey("DeityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_deity_weapons_deities_deity_id");
+
+ b.Navigation("Deity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_feats_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.FeatRelation.FeatPrerequisite", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Feat", "Feat")
+ .WithMany("FeatPrerequisites")
+ .HasForeignKey("FeatId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_feat_prerequisites_feats_feat_id");
+
+ b.Navigation("Feat");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Heritage", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Ancestry", "Ancestry")
+ .WithMany("Heritages")
+ .HasForeignKey("AncestryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .HasConstraintName("fk_heritages_ancestries_ancestry_id");
+
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Heritage", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_heritages_entities_id");
+
+ b.Navigation("Ancestry");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Spell", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_spells_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
+ .WithOne("SpellArea")
+ .HasForeignKey("Pf2eModel.Model.Structure.SpellRelation.SpellArea", "SpellId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .HasConstraintName("fk_spell_areas_spells_spell_id");
+
+ b.Navigation("Spell");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
+ .WithMany("SpellDamages")
+ .HasForeignKey("SpellId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_spell_damages_spells_spell_id");
+
+ b.Navigation("Spell");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDefense", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
+ .WithMany("SpellDefenses")
+ .HasForeignKey("SpellId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_spell_defenses_spells_spell_id");
+
+ b.Navigation("Spell");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellRitual", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
+ .WithOne("SpellRitual")
+ .HasForeignKey("Pf2eModel.Model.Structure.SpellRelation.SpellRitual", "SpellId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .HasConstraintName("fk_spell_rituals_spells_spell_id");
+
+ b.Navigation("Spell");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Trait", b =>
+ {
+ b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
+ .WithOne()
+ .HasForeignKey("Pf2eModel.Model.Structure.Trait", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_traits_entities_id");
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Entity", b =>
+ {
+ b.Navigation("Aliases");
+
+ b.Navigation("Externals");
+
+ b.Navigation("Sources");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Keywords.Keyword", b =>
+ {
+ b.Navigation("Aliases");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Source.Source", b =>
+ {
+ b.Navigation("EntitySources");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Base.Targets.ExternalTarget", b =>
+ {
+ b.Navigation("EntityExternals");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Ancestry", b =>
+ {
+ b.Navigation("AncestryBoosts");
+
+ b.Navigation("AncestryItems");
+
+ b.Navigation("AncestryLanguages");
+
+ b.Navigation("Heritages");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
+ {
+ b.Navigation("BackgroundBoosts");
+
+ b.Navigation("BackgroundItems");
+
+ b.Navigation("BackgroundSkills");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Class", b =>
+ {
+ b.Navigation("ClassKeyAbilities");
+
+ b.Navigation("ClassProgressions");
+
+ b.Navigation("ClassTrainings");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Deity", b =>
+ {
+ b.Navigation("DeityAttributes");
+
+ b.Navigation("DeityDomains");
+
+ b.Navigation("DeitySpells");
+
+ b.Navigation("DeityWeapons");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b =>
+ {
+ b.Navigation("FeatPrerequisites");
+ });
+
+ modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b =>
+ {
+ b.Navigation("SpellArea");
+
+ b.Navigation("SpellDamages");
+
+ b.Navigation("SpellDefenses");
+
+ b.Navigation("SpellRitual");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Pf2eModel/Migrations/20250418083111_1.cs b/Pf2eModel/Migrations/20250418083111_1.cs
new file mode 100644
index 0000000..d270f10
--- /dev/null
+++ b/Pf2eModel/Migrations/20250418083111_1.cs
@@ -0,0 +1,1199 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Pf2eModel.Model.Enum;
+
+#nullable disable
+
+namespace Pf2eModel.Migrations
+{
+ ///
+ public partial class _1 : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterDatabase()
+ .Annotation("Npgsql:Enum:action_category", "unknown,offensive,defensive,interaction,familiar,army_tactic,army_war_action,kingdom_activity,kingdom_feat,kingdom_feature")
+ .Annotation("Npgsql:Enum:action_type", "none,1_action,2_actions,3_actions,1-3_actions,1-2_actions")
+ .Annotation("Npgsql:Enum:alias_type", "legacy,english,legacy_english,hobby,other")
+ .Annotation("Npgsql:Enum:ancestry_vision", "normal,low-light-vision,darkvision")
+ .Annotation("Npgsql:Enum:attribute_values", "any,str,dex,con,int,wis,cha")
+ .Annotation("Npgsql:Enum:class_progression_type", "entity,ancestry_feat,class_feat,general_feat,skill_feat,skill_increase")
+ .Annotation("Npgsql:Enum:condition_group", "unknown,senses,abilities,death,attitudes,detection")
+ .Annotation("Npgsql:Enum:deity_category", "deity,pantheon,covenant,philosophy")
+ .Annotation("Npgsql:Enum:deity_fonts", "none,heal,harm,any")
+ .Annotation("Npgsql:Enum:deity_sanctification", "holy,unholy,any")
+ .Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique")
+ .Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,background,backpack,campaign_feature,class,condition,deity,feat,heritage,spell")
+ .Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free")
+ .Annotation("Npgsql:Enum:feat_category", "ancestryfeature,classfeature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign_feature")
+ .Annotation("Npgsql:Enum:size", "med,tiny")
+ .Annotation("Npgsql:Enum:source_category", "rulebook,adventure-path,lost-omens,adventures,comics,blog-posts,society")
+ .Annotation("Npgsql:Enum:spell_area_type", "burst,emanation,cone,line,square,cube,cylinder")
+ .Annotation("Npgsql:Enum:spell_damage_category", "persistent,splash")
+ .Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any")
+ .Annotation("Npgsql:Enum:training_stage", "untrained,trained,expert,master,legendary")
+ .Annotation("Npgsql:Enum:trait_type", "regular,tradition");
+
+ migrationBuilder.CreateTable(
+ name: "entities",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Отображаемое имя"),
+ type = table.Column(type: "entity_type", nullable: false, comment: "Тип объекта"),
+ slug = table.Column(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL"),
+ img = table.Column(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Изображение объекта"),
+ description = table.Column(type: "text", nullable: false, comment: "Текстовое описание объекта"),
+ rarity = table.Column(type: "entity_rarity", nullable: false),
+ is_translated = table.Column(type: "boolean", nullable: true, comment: "Флаг, указывающий, что у объекта существует перевод"),
+ is_checked = table.Column(type: "boolean", nullable: true, comment: "Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_entities", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "external_targets",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false),
+ icon = table.Column(type: "character varying(255)", maxLength: 255, nullable: false),
+ prefix = table.Column(type: "character varying(255)", maxLength: 255, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_external_targets", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "frequencies",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ max = table.Column(type: "integer", nullable: false),
+ per = table.Column(type: "integer", nullable: false),
+ value = table.Column(type: "integer", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_frequencies", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "keywords",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ slug = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_keywords", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "languages",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false),
+ slug = table.Column(type: "character varying(255)", maxLength: 255, nullable: false),
+ rarity = table.Column(type: "entity_rarity", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_languages", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "sources",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false),
+ category = table.Column(type: "source_category", nullable: false),
+ release_date = table.Column(type: "date", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_sources", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "trainings",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ key = table.Column(type: "character varying(255)", maxLength: 255, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_trainings", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "actions",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ type = table.Column(type: "action_type", nullable: false),
+ actions = table.Column(type: "integer", nullable: true),
+ max_actions = table.Column(type: "integer", nullable: true),
+ is_reaction = table.Column(type: "boolean", nullable: false),
+ is_free_action = table.Column(type: "boolean", nullable: false),
+ is_passive = table.Column(type: "boolean", nullable: false),
+ extra = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_actions", x => x.id);
+ table.ForeignKey(
+ name: "fk_actions_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ancestries",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ size = table.Column(type: "size", nullable: false),
+ hp = table.Column(type: "integer", nullable: false),
+ reach = table.Column(type: "integer", nullable: false),
+ speed = table.Column(type: "integer", nullable: false),
+ vision = table.Column(type: "ancestry_vision", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_ancestries", x => x.id);
+ table.ForeignKey(
+ name: "fk_ancestries_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "backgrounds",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_backgrounds", x => x.id);
+ table.ForeignKey(
+ name: "fk_backgrounds_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "classes",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ hp = table.Column(type: "integer", nullable: false),
+ perception = table.Column(type: "integer", nullable: false),
+ spellcasting = table.Column(type: "boolean", nullable: false),
+ additional_trained_skills = table.Column(type: "integer", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_classes", x => x.id);
+ table.ForeignKey(
+ name: "fk_classes_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "conditions",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ group = table.Column(type: "condition_group", nullable: true),
+ extra = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_conditions", x => x.id);
+ table.ForeignKey(
+ name: "fk_conditions_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "deities",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ category = table.Column(type: "deity_category", nullable: false),
+ fonts = table.Column(type: "deity_fonts", nullable: false),
+ sanctification = table.Column(type: "deity_sanctification", nullable: false),
+ sanctification_must = table.Column(type: "boolean", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_deities", x => x.id);
+ table.ForeignKey(
+ name: "fk_deities_entities_id",
+ column: x => x.id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "entity_aliases",
+ columns: table => new
+ {
+ entity_id = table.Column(type: "integer", nullable: false),
+ type = table.Column(type: "alias_type", nullable: false),
+ alias = table.Column(type: "character varying(255)", maxLength: 255, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_entity_aliases", x => new { x.entity_id, x.type });
+ table.ForeignKey(
+ name: "fk_entity_aliases_entities_entity_id",
+ column: x => x.entity_id,
+ principalTable: "entities",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "feats",
+ columns: table => new
+ {
+ id = table.Column(type: "integer", nullable: false),
+ type = table.Column(type: "action_type", nullable: false),
+ category = table.Column(type: "action_category", nullable: false),
+ actions = table.Column