Документирование и небольшой рефакторинг модели.

This commit is contained in:
2025-05-11 00:31:15 +04:00
parent 1a977ee988
commit 3c65274b45
64 changed files with 1960 additions and 554 deletions
@@ -18,11 +18,11 @@ public static class AonprdEnumResolver
{ "Society", SourceCategory.Society }, { "Society", SourceCategory.Society },
} }
), ),
new Solver<AncestryVision>( new Solver<VisionEnum>(
new() new()
{ {
{ "Low-Light Vision", AncestryVision.LowLightVision }, { "Low-Light VisionEnum", VisionEnum.LowLightVision },
{ "Darkvision", AncestryVision.DarkVision }, { "Darkvision", VisionEnum.DarkVision },
} }
), ),
new Solver<AttributeValues>( new Solver<AttributeValues>(
@@ -26,7 +26,7 @@ internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityPro
Object.Size = Input Object.Size = Input
.GetRequired<JArray>("size") .GetRequired<JArray>("size")
.Select(t => Input.Enum<Size>(t.ToString())) .Select(t => Input.Enum<SizeEnum>(t.ToString()))
.ToArray(); .ToArray();
string hp = Input.GetRequired<string>("hp_raw"); string hp = Input.GetRequired<string>("hp_raw");
@@ -34,7 +34,7 @@ internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityPro
Object.Speed = Convert.ToInt32(Input.GetOptional<int>("speed.land")); Object.Speed = Convert.ToInt32(Input.GetOptional<int>("speed.land"));
Object.Vision = Input.EnumOptional("vision", AncestryVision.Normal); Object.VisionEnum = Input.EnumOptional("vision", VisionEnum.Normal);
AddBoosts("attribute", true); AddBoosts("attribute", true);
AddBoosts("attribute_flaw", false); AddBoosts("attribute_flaw", false);
@@ -21,8 +21,8 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
Object.Level = Input.GetRequired<int>("level"); Object.Level = Input.GetRequired<int>("level");
Object.Category = Entity.Traits.Any(t => t.Type == TraitType.Class) Object.Category = Entity.Traits.Any(t => t.Type == TraitType.Class)
? ActionCategory.ClassFeat ? FeatCategory.Class
: ActionCategory.Unknown; : FeatCategory.Uncategorized;
AonprdProcessorInput.ActionStruct action = Input.ResolveActionString( AonprdProcessorInput.ActionStruct action = Input.ResolveActionString(
Input.GetOptional<string>("actions") ?? "" Input.GetOptional<string>("actions") ?? ""
@@ -54,7 +54,7 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
if (archetypes.Length != 0) if (archetypes.Length != 0)
{ {
Object.Category = ActionCategory.Archetype; Object.Category = FeatCategory.Archetype;
} }
foreach (Archetype archetype in archetypes) foreach (Archetype archetype in archetypes)
+20 -3
View File
@@ -1,15 +1,30 @@
using System.Reflection; using System.ComponentModel;
using System.Reflection;
using Pf2eModel.Model; using Pf2eModel.Model;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel; namespace Pf2eModel;
/// <summary>
/// Аттрибут, указывающий тип сущности.
/// </summary>
/// <param name="type">Тип сущности.</param>
[AttributeUsage(AttributeTargets.Class)] [AttributeUsage(AttributeTargets.Class)]
public class EntityOfTypeAttribute(EntityType type) : Attribute public class EntityOfTypeAttribute(EntityType type) : Attribute
{ {
/// <summary>
/// Тип сущности.
/// </summary>
public EntityType Type { get; } = type; public EntityType Type { get; } = type;
/// <summary>
/// Метод для получения программного типа сущности по её типу.
/// </summary>
/// <param name="entity">Тип сущности.</param>
/// <returns>Программный тип сущности.</returns>
/// <exception cref="Exception">Если есть ошибка в структурах.</exception>
/// <exception cref="InvalidEnumArgumentException">Тип сущности.</exception>
public static Type Resolve(Entity entity) public static Type Resolve(Entity entity)
{ {
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
@@ -21,7 +36,7 @@ public class EntityOfTypeAttribute(EntityType type) : Attribute
if (!type.IsAssignableTo(typeof(IEntity))) if (!type.IsAssignableTo(typeof(IEntity)))
{ {
throw new Exception( throw new(
$"'EntityOfTypeAttribute' attribute should only be applied to children of 'IEntity' class. '{type.FullName}' is not." $"'EntityOfTypeAttribute' attribute should only be applied to children of 'IEntity' class. '{type.FullName}' is not."
); );
} }
@@ -34,6 +49,8 @@ public class EntityOfTypeAttribute(EntityType type) : Attribute
} }
} }
throw new Exception($"Can't resolve class associated with '{entity.Type}' EntityType."); throw new InvalidEnumArgumentException(
$"Can't resolve class associated with '{entity.Type}' EntityType."
);
} }
} }
@@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum;
namespace Pf2eModel.Migrations namespace Pf2eModel.Migrations
{ {
[DbContext(typeof(Pf2eDbContext))] [DbContext(typeof(Pf2eDbContext))]
[Migration("20250508101742_1")] [Migration("20250510202833_1")]
partial class _1 partial class _1
{ {
/// <inheritdoc /> /// <inheritdoc />
@@ -24,28 +24,28 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4") .HasAnnotation("ProductVersion", "9.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "archetype", "class-feature", "class-feat", "offensive", "defensive", "interaction", "familiar", "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "archetype", "army_tactic", "army_war_action", "class-feat", "class-feature", "defensive", "familiar", "interaction", "kingdom_activity", "kingdom_feat", "kingdom_feature", "offensive", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "unknown", "1", "2", "3", "reaction", "free", "passive", "other", "1-3", "1-2", "2-3", "2/2 rounds", "reaction/1", "reaction/2", "reaction/3", "free/1", "1 minute", "5 minutes", "10 minutes", "30 minutes", "1 hour" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "1", "1 hour", "1 minute", "1-2", "1-3", "10 minutes", "2", "2-3", "2/2 rounds", "3", "30 minutes", "5 minutes", "free", "free/1", "other", "passive", "reaction", "reaction/1", "reaction/2", "reaction/3", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "cha", "con", "dex", "free", "int", "str", "wis" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "ancestry_feat", "attribute_increase", "class_feat", "entity", "general_feat", "skill_feat", "skill_increase" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "abilities", "attitudes", "death", "detection", "senses", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "unknown", "senses", "abilities", "death", "attitudes", "detection" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "covenant", "deity", "pantheon", "philosophy" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "any", "harm", "heal", "none" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "any", "holy", "unholy" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "element_enum", new[] { "air", "earth", "fire", "metal", "universal", "water", "wood" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "rare", "uncommon", "unique" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "language", "ritual", "rule", "spell", "subclass", "subclass_group", "trait", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestry", "ancestry-feature", "archetype", "bonus", "calling", "campaign-feature", "class", "class-feature", "curse", "deityboon", "general", "pfsboon", "skill", "uncategorized" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "hobby", "legacy", "legacy_english", "other", "russian" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size_enum", new[] { "huge", "large", "medium", "small", "tiny" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "adventure-path", "adventures", "blog-posts", "comics", "lost-omens", "rulebook", "society" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "society" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "circle", "cone", "cube", "cuboid", "cylinder", "emanation", "line", "other", "square", "varies" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder", "varies", "cuboid", "circle", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "normal", "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "any", "damage", "healing" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "all", "arcane", "divine", "elemental", "none", "occult", "primal" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "expert", "legendary", "master", "mythic", "trained", "untrained" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "untrained", "trained", "expert", "master", "legendary", "mythic" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "class", "regular", "tradition" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "vision_enum", new[] { "dark-vision", "low-light-vision", "normal" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("DeityTraining", b => modelBuilder.Entity("DeityTraining", b =>
@@ -120,7 +120,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("description") .HasColumnName("description")
.HasColumnOrder(6) .HasColumnOrder(6)
.HasComment("Текстовое описание объекта"); .HasComment("Текстовое описание сущности");
b.Property<string>("Img") b.Property<string>("Img")
.IsRequired() .IsRequired()
@@ -134,13 +134,13 @@ namespace Pf2eModel.Migrations
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_checked") .HasColumnName("is_checked")
.HasColumnOrder(9) .HasColumnOrder(9)
.HasComment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи"); .HasComment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи");
b.Property<bool?>("IsTranslated") b.Property<bool?>("IsTranslated")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_translated") .HasColumnName("is_translated")
.HasColumnOrder(8) .HasColumnOrder(8)
.HasComment("Флаг, указывающий, что у объекта существует перевод"); .HasComment("Флаг, указывающий, что у сущности существует перевод");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
@@ -152,7 +152,8 @@ namespace Pf2eModel.Migrations
b.Property<EntityRarity>("Rarity") b.Property<EntityRarity>("Rarity")
.HasColumnType("entity_rarity") .HasColumnType("entity_rarity")
.HasColumnName("rarity") .HasColumnName("rarity")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Редкость сущности");
b.Property<string>("Slug") b.Property<string>("Slug")
.IsRequired() .IsRequired()
@@ -166,7 +167,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("entity_type") .HasColumnType("entity_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3) .HasColumnOrder(3)
.HasComment("Тип объекта"); .HasComment("Тип сущности");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_entities"); .HasName("pk_entities");
@@ -188,14 +189,16 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<string>("Slug") b.Property<string>("Slug")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("slug") .HasColumnName("slug")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Часть имени в URL");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_keywords"); .HasName("pk_keywords");
@@ -209,21 +212,24 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("KeywordId") b.Property<int>("KeywordId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("keyword_id") .HasColumnName("keyword_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор ключевого слова");
b.Property<string>("Value") b.Property<string>("Value")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("value") .HasColumnName("value")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Синоним");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_keyword_aliases"); .HasName("pk_keyword_aliases");
@@ -240,14 +246,16 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(0); .HasColumnOrder(0)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор сущности");
b.Property<bool>("IsRemaster") b.Property<bool>("IsRemaster")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -258,7 +266,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("SourceId") b.Property<int>("SourceId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("source_id") .HasColumnName("source_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор источника");
b.Property<string>("Suffix") b.Property<string>("Suffix")
.IsRequired() .IsRequired()
@@ -286,26 +295,30 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<SourceCategory>("Category") b.Property<SourceCategory>("Category")
.HasColumnType("source_category") .HasColumnType("source_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Категория источника");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<DateOnly?>("ReleaseDate") b.Property<DateOnly?>("ReleaseDate")
.HasColumnType("date") .HasColumnType("date")
.HasColumnName("release_date") .HasColumnName("release_date")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Дата выхода источника");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_sources"); .HasName("pk_sources");
@@ -318,12 +331,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор сущности");
b.Property<int>("TargetId") b.Property<int>("TargetId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("target_id") .HasColumnName("target_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор цели");
b.Property<string>("Md5") b.Property<string>("Md5")
.IsRequired() .IsRequired()
@@ -331,7 +346,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("character varying(32)") .HasColumnType("character varying(32)")
.HasColumnName("md5") .HasColumnName("md5")
.HasColumnOrder(5) .HasColumnOrder(5)
.HasComment("Контроль версии объекта"); .HasComment("Контрольная сумма объекта");
b.Property<string>("Suffix") b.Property<string>("Suffix")
.IsRequired() .IsRequired()
@@ -356,7 +371,8 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
@@ -365,21 +381,24 @@ namespace Pf2eModel.Migrations
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("icon") .HasColumnName("icon")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Иконка цели");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<string>("Prefix") b.Property<string>("Prefix")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("prefix") .HasColumnName("prefix")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Префикс для URL-адреса внешней ссылки");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_external_targets"); .HasName("pk_external_targets");
@@ -393,24 +412,28 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Max") b.Property<int>("Max")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("max") .HasColumnName("max")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Максимальная продолжительсность");
b.Property<int>("Per") b.Property<int>("Per")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("per") .HasColumnName("per")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Частота использования");
b.Property<int?>("Value") b.Property<int?>("Value")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("value") .HasColumnName("value")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Значение использования");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_frequencies"); .HasName("pk_frequencies");
@@ -424,7 +447,8 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
@@ -432,12 +456,14 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Название способности");
b.Property<int>("Type") b.Property<int>("Type")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Тип способности");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_trainings"); .HasName("pk_trainings");
@@ -450,17 +476,20 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<ActionEnum>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("action_enum") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Количество действий");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_actions"); .HasName("pk_actions");
@@ -473,28 +502,33 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("Hp") b.Property<int>("Hp")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("hp") .HasColumnName("hp")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Количество очков здоровья");
b.PrimitiveCollection<Size[]>("Size") b.PrimitiveCollection<SizeEnum[]>("Size")
.IsRequired() .IsRequired()
.HasColumnType("size[]") .HasColumnType("size_enum[]")
.HasColumnName("size") .HasColumnName("size")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Размеры родословной");
b.Property<int>("Speed") b.Property<int>("Speed")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("speed") .HasColumnName("speed")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Скорость передвижения");
b.Property<AncestryVision>("Vision") b.Property<VisionEnum>("VisionEnum")
.HasColumnType("ancestry_vision") .HasColumnType("vision_enum")
.HasColumnName("vision") .HasColumnName("vision_enum")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Тип зрения");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_ancestries"); .HasName("pk_ancestries");
@@ -593,22 +627,26 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("DedicationFeatId") b.Property<int?>("DedicationFeatId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("dedication_feat_id") .HasColumnName("dedication_feat_id")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("ID посвящения");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Дополнительная информация");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Уровень");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_archetypes"); .HasName("pk_archetypes");
@@ -644,7 +682,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_backgrounds"); .HasName("pk_backgrounds");
@@ -746,32 +785,32 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("AdditionalTrainedSkills") b.Property<int>("AdditionalTrainedSkills")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("additional_trained_skills") .HasColumnName("additional_trained_skills")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Дополнительные навыки");
b.Property<int>("Hp") b.Property<int>("Hp")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("hp") .HasColumnName("hp")
.HasColumnOrder(3); .HasColumnOrder(2)
.HasComment("Количество очков здоровья");
b.Property<int>("Perception")
.HasColumnType("integer")
.HasColumnName("perception")
.HasColumnOrder(4);
b.Property<bool>("Spellcasting") b.Property<bool>("Spellcasting")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("spellcasting") .HasColumnName("spellcasting")
.HasColumnOrder(5); .HasColumnOrder(3)
.HasComment("Заклинатель?");
b.Property<SpellTradition>("Tradition") b.Property<SpellTradition?>("Tradition")
.HasColumnType("spell_tradition") .HasColumnType("spell_tradition")
.HasColumnName("tradition") .HasColumnName("tradition")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Традиция заклинаний");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_classes"); .HasName("pk_classes");
@@ -948,17 +987,20 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.Property<ConditionGroup?>("Group") b.Property<ConditionGroup?>("Group")
.HasColumnType("condition_group") .HasColumnType("condition_group")
.HasColumnName("group") .HasColumnName("group")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Группа состояния");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_conditions"); .HasName("pk_conditions");
@@ -971,27 +1013,32 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<DeityCategory>("Category") b.Property<DeityCategory>("Category")
.HasColumnType("deity_category") .HasColumnType("deity_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Тип божества");
b.Property<DeityFonts>("Fonts") b.Property<DeityFonts>("Fonts")
.HasColumnType("deity_fonts") .HasColumnType("deity_fonts")
.HasColumnName("fonts") .HasColumnName("fonts")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Тип божественной силы");
b.Property<DeitySanctification>("Sanctification") b.Property<DeitySanctification>("Sanctification")
.HasColumnType("deity_sanctification") .HasColumnType("deity_sanctification")
.HasColumnName("sanctification") .HasColumnName("sanctification")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Тип освящения");
b.Property<bool>("SanctificationMust") b.Property<bool>("SanctificationMust")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("sanctification_must") .HasColumnName("sanctification_must")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Обязательное освящение");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_deities"); .HasName("pk_deities");
@@ -1126,22 +1173,26 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("Actions") b.Property<int?>("Actions")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Количество действий");
b.Property<ActionCategory>("Category") b.Property<FeatCategory>("Category")
.HasColumnType("action_category") .HasColumnType("feat_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Категория способности");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Дополнительная информация");
b.Property<bool>("IsFreeAction") b.Property<bool>("IsFreeAction")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -1161,7 +1212,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Уровень способности");
b.Property<int?>("MaxActions") b.Property<int?>("MaxActions")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1210,12 +1262,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("AncestryId") b.Property<int?>("AncestryId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("ancestry_id") .HasColumnName("ancestry_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор родословной");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_heritages"); .HasName("pk_heritages");
@@ -1229,12 +1283,10 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1254,7 +1306,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("CastTime") b.Property<int>("CastTime")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1265,7 +1318,8 @@ namespace Pf2eModel.Migrations
b.Property<string>("Cost") b.Property<string>("Cost")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("cost") .HasColumnName("cost")
.HasColumnOrder(14); .HasColumnOrder(14)
.HasComment("Стоимость ритуала");
b.Property<int>("Duration") b.Property<int>("Duration")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1273,61 +1327,72 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(4) .HasColumnOrder(4)
.HasComment("Время действия эффекта ритуала в секундах"); .HasComment("Время действия эффекта ритуала в секундах");
b.PrimitiveCollection<int[]>("Elements") b.PrimitiveCollection<ElementEnum[]>("Elements")
.IsRequired() .IsRequired()
.HasColumnType("integer[]") .HasColumnType("element_enum[]")
.HasColumnName("elements") .HasColumnName("elements")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Элементы ритуала");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Уровень ритуала");
b.Property<TrainingRank>("PrimaryCheckRank") b.Property<TrainingRank>("PrimaryCheckRank")
.HasColumnType("training_rank") .HasColumnType("training_rank")
.HasColumnName("primary_check_rank") .HasColumnName("primary_check_rank")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Ранг основной проверки");
b.Property<string>("PrimaryCheckSuffix") b.Property<string>("PrimaryCheckSuffix")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("primary_check_suffix") .HasColumnName("primary_check_suffix")
.HasColumnOrder(8); .HasColumnOrder(8)
.HasComment("Дополнительная информация об основной проверки");
b.Property<int>("Range") b.Property<int>("Range")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Дальнность ритуала");
b.Property<string>("RangeString") b.Property<string>("RangeString")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("range_string") .HasColumnName("range_string")
.HasColumnOrder(12); .HasColumnOrder(12)
.HasComment("Дальность ритуала");
b.Property<string>("Requirement") b.Property<string>("Requirement")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("requirement") .HasColumnName("requirement")
.HasColumnOrder(15); .HasColumnOrder(15)
.HasComment("Требования к ритуалу");
b.Property<int>("SecondaryCasters") b.Property<int>("SecondaryCasters")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("secondary_casters") .HasColumnName("secondary_casters")
.HasColumnOrder(9); .HasColumnOrder(9)
.HasComment("Количество дополнительных заклинателей");
b.Property<int>("SecondaryCastersMax") b.Property<int>("SecondaryCastersMax")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("secondary_casters_max") .HasColumnName("secondary_casters_max")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Максимальное количество дополнительных заклинателей");
b.Property<string>("SecondaryCastersSuffix") b.Property<string>("SecondaryCastersSuffix")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("secondary_casters_suffix") .HasColumnName("secondary_casters_suffix")
.HasColumnOrder(11); .HasColumnOrder(11)
.HasComment("Дополнительная информация о дополнительных заклинателях");
b.Property<string>("Target") b.Property<string>("Target")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(13); .HasColumnOrder(13)
.HasComment("Цель ритуала");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_rituals"); .HasName("pk_rituals");
@@ -1411,7 +1476,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.PrimitiveCollection<string[]>("Breadcrumbs") b.PrimitiveCollection<string[]>("Breadcrumbs")
.IsRequired() .IsRequired()
@@ -1421,12 +1487,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Order") b.Property<int>("Order")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("order") .HasColumnName("order")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Порядок отображения");
b.Property<int?>("ParentId") b.Property<int?>("ParentId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("parent_id") .HasColumnName("parent_id")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Родительского правило");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_rules"); .HasName("pk_rules");
@@ -1442,34 +1510,40 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<ActionEnum>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("action_enum") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Количество действий");
b.Property<string>("Cost") b.Property<string>("Cost")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("cost") .HasColumnName("cost")
.HasColumnOrder(11); .HasColumnOrder(11)
.HasComment("Стоимость заклинания");
b.Property<int?>("Duration") b.Property<int?>("Duration")
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("duration") .HasColumnName("duration")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Время длительности заклинания");
b.PrimitiveCollection<int[]>("Elements") b.PrimitiveCollection<ElementEnum[]>("Elements")
.IsRequired() .IsRequired()
.HasColumnType("integer[]") .HasColumnType("element_enum[]")
.HasColumnName("elements") .HasColumnName("elements")
.HasColumnOrder(8); .HasColumnOrder(8)
.HasComment("Элементы заклинания");
b.Property<bool>("IsFocus") b.Property<bool>("IsFocus")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_focus") .HasColumnName("is_focus")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Фокус?");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1479,28 +1553,33 @@ namespace Pf2eModel.Migrations
b.Property<int>("Range") b.Property<int>("Range")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Дальность заклинания");
b.Property<string>("Requirement") b.Property<string>("Requirement")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("requirement") .HasColumnName("requirement")
.HasColumnOrder(12); .HasColumnOrder(12)
.HasComment("Требования к заклинанию");
b.Property<string>("Target") b.Property<string>("Target")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Цель заклинания");
b.PrimitiveCollection<SpellTradition[]>("Traditions") b.PrimitiveCollection<SpellTradition[]>("Traditions")
.IsRequired() .IsRequired()
.HasColumnType("spell_tradition[]") .HasColumnType("spell_tradition[]")
.HasColumnName("traditions") .HasColumnName("traditions")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Традиции заклинания");
b.Property<string>("Trigger") b.Property<string>("Trigger")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("trigger") .HasColumnName("trigger")
.HasColumnOrder(9); .HasColumnOrder(9)
.HasComment("Триггер заклинания");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_spells"); .HasName("pk_spells");
@@ -1655,13 +1734,15 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<string>("Additional") b.Property<string>("Additional")
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("additional") .HasColumnName("additional")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.Property<string>("Extra") b.Property<string>("Extra")
.IsRequired() .IsRequired()
@@ -1672,7 +1753,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("GroupId") b.Property<int>("GroupId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("group_id") .HasColumnName("group_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Группа подклассов");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_subclasses"); .HasName("pk_subclasses");
@@ -1688,12 +1770,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("ClassId") b.Property<int?>("ClassId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("class_id") .HasColumnName("class_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор класса");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_subclass_groups"); .HasName("pk_subclass_groups");
@@ -1709,12 +1793,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<TraitType>("Type") b.Property<TraitType>("Type")
.HasColumnType("trait_type") .HasColumnType("trait_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Тип признака");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_traits"); .HasName("pk_traits");
@@ -14,28 +14,28 @@ namespace Pf2eModel.Migrations
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.AlterDatabase() migrationBuilder.AlterDatabase()
.Annotation("Npgsql:Enum:action_category", "unknown,archetype,class-feature,class-feat,offensive,defensive,interaction,familiar,army_tactic,army_war_action,kingdom_activity,kingdom_feat,kingdom_feature") .Annotation("Npgsql:Enum:action_category", "archetype,army_tactic,army_war_action,class-feat,class-feature,defensive,familiar,interaction,kingdom_activity,kingdom_feat,kingdom_feature,offensive,unknown")
.Annotation("Npgsql:Enum:action_enum", "unknown,1,2,3,reaction,free,passive,other,1-3,1-2,2-3,2/2 rounds,reaction/1,reaction/2,reaction/3,free/1,1 minute,5 minutes,10 minutes,30 minutes,1 hour") .Annotation("Npgsql:Enum:action_enum", "1,1 hour,1 minute,1-2,1-3,10 minutes,2,2-3,2/2 rounds,3,30 minutes,5 minutes,free,free/1,other,passive,reaction,reaction/1,reaction/2,reaction/3,unknown")
.Annotation("Npgsql:Enum:ancestry_vision", "normal,low-light-vision,dark-vision") .Annotation("Npgsql:Enum:attribute_values", "cha,con,dex,free,int,str,wis")
.Annotation("Npgsql:Enum:attribute_values", "free,str,dex,con,int,wis,cha") .Annotation("Npgsql:Enum:class_progression_type", "ancestry_feat,attribute_increase,class_feat,entity,general_feat,skill_feat,skill_increase")
.Annotation("Npgsql:Enum:class_progression_type", "entity,ancestry_feat,class_feat,general_feat,skill_feat,skill_increase") .Annotation("Npgsql:Enum:condition_group", "abilities,attitudes,death,detection,senses,unknown")
.Annotation("Npgsql:Enum:condition_group", "unknown,senses,abilities,death,attitudes,detection") .Annotation("Npgsql:Enum:deity_category", "covenant,deity,pantheon,philosophy")
.Annotation("Npgsql:Enum:deity_category", "deity,pantheon,covenant,philosophy") .Annotation("Npgsql:Enum:deity_fonts", "any,harm,heal,none")
.Annotation("Npgsql:Enum:deity_fonts", "none,heal,harm,any") .Annotation("Npgsql:Enum:deity_sanctification", "any,holy,unholy")
.Annotation("Npgsql:Enum:deity_sanctification", "holy,unholy,any") .Annotation("Npgsql:Enum:element_enum", "air,earth,fire,metal,universal,water,wood")
.Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique") .Annotation("Npgsql:Enum:entity_rarity", "common,rare,uncommon,unique")
.Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,subclass_group,subclass,condition,deity,feat,heritage,spell,ritual,language,rule") .Annotation("Npgsql:Enum:entity_type", "action,ancestry,archetype,background,backpack,campaign_feature,class,condition,deity,feat,heritage,language,ritual,rule,spell,subclass,subclass_group,trait,unknown")
.Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free") .Annotation("Npgsql:Enum:feat_category", "ancestry,ancestry-feature,archetype,bonus,calling,campaign-feature,class,class-feature,curse,deityboon,general,pfsboon,skill,uncategorized")
.Annotation("Npgsql:Enum:feat_category", "uncategorized,ancestry-feature,class-feature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign-feature") .Annotation("Npgsql:Enum:locale_type", "english,hobby,legacy,legacy_english,other,russian")
.Annotation("Npgsql:Enum:locale_type", "english,legacy_english,russian,legacy,hobby,other") .Annotation("Npgsql:Enum:size_enum", "huge,large,medium,small,tiny")
.Annotation("Npgsql:Enum:size", "tiny,small,medium,large") .Annotation("Npgsql:Enum:source_category", "adventure-path,adventures,blog-posts,comics,lost-omens,rulebook,society")
.Annotation("Npgsql:Enum:source_category", "rulebook,adventure-path,lost-omens,adventures,comics,blog-posts,society") .Annotation("Npgsql:Enum:spell_area_type", "burst,circle,cone,cube,cuboid,cylinder,emanation,line,other,square,varies")
.Annotation("Npgsql:Enum:spell_area_type", "burst,emanation,cone,line,square,cube,cylinder,varies,cuboid,circle,other") .Annotation("Npgsql:Enum:spell_damage_category", "normal,persistent,splash")
.Annotation("Npgsql:Enum:spell_damage_category", "persistent,splash") .Annotation("Npgsql:Enum:spell_damage_kinds", "any,damage,healing")
.Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any") .Annotation("Npgsql:Enum:spell_tradition", "all,arcane,divine,elemental,none,occult,primal")
.Annotation("Npgsql:Enum:spell_tradition", "none,divine,occult,arcane,primal,elemental,all") .Annotation("Npgsql:Enum:training_rank", "expert,legendary,master,mythic,trained,untrained")
.Annotation("Npgsql:Enum:training_rank", "untrained,trained,expert,master,legendary,mythic") .Annotation("Npgsql:Enum:trait_type", "class,regular,tradition")
.Annotation("Npgsql:Enum:trait_type", "regular,class,tradition"); .Annotation("Npgsql:Enum:vision_enum", "dark-vision,low-light-vision,normal");
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "entities", name: "entities",
@@ -44,13 +44,13 @@ namespace Pf2eModel.Migrations
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"), name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"),
type = table.Column<EntityType>(type: "entity_type", nullable: false, comment: "Тип объекта"), type = table.Column<EntityType>(type: "entity_type", nullable: false, comment: "Тип сущности"),
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL"), slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL"),
img = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Изображение объекта"), img = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Изображение объекта"),
description = table.Column<string>(type: "text", nullable: false, comment: "Текстовое описание объекта"), description = table.Column<string>(type: "text", nullable: false, comment: "Текстовое описание сущности"),
rarity = table.Column<EntityRarity>(type: "entity_rarity", nullable: false), rarity = table.Column<EntityRarity>(type: "entity_rarity", nullable: false, comment: "Редкость сущности"),
is_translated = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что у объекта существует перевод"), is_translated = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что у сущности существует перевод"),
is_checked = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи") is_checked = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи")
}, },
constraints: table => constraints: table =>
{ {
@@ -61,11 +61,11 @@ namespace Pf2eModel.Migrations
name: "external_targets", name: "external_targets",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Отображаемое имя"),
icon = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), icon = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Иконка цели"),
prefix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false) prefix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Префикс для URL-адреса внешней ссылки")
}, },
constraints: table => constraints: table =>
{ {
@@ -76,11 +76,11 @@ namespace Pf2eModel.Migrations
name: "frequencies", name: "frequencies",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
max = table.Column<int>(type: "integer", nullable: false), max = table.Column<int>(type: "integer", nullable: false, comment: "Максимальная продолжительсность"),
per = table.Column<int>(type: "integer", nullable: false), per = table.Column<int>(type: "integer", nullable: false, comment: "Частота использования"),
value = table.Column<int>(type: "integer", nullable: true) value = table.Column<int>(type: "integer", nullable: true, comment: "Значение использования")
}, },
constraints: table => constraints: table =>
{ {
@@ -93,8 +93,8 @@ namespace Pf2eModel.Migrations
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "jsonb", nullable: false), name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"),
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false) slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL")
}, },
constraints: table => constraints: table =>
{ {
@@ -105,11 +105,11 @@ namespace Pf2eModel.Migrations
name: "sources", name: "sources",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Отображаемое имя"),
category = table.Column<SourceCategory>(type: "source_category", nullable: false), category = table.Column<SourceCategory>(type: "source_category", nullable: false, comment: "Категория источника"),
release_date = table.Column<DateOnly>(type: "date", nullable: true) release_date = table.Column<DateOnly>(type: "date", nullable: true, comment: "Дата выхода источника")
}, },
constraints: table => constraints: table =>
{ {
@@ -120,10 +120,10 @@ namespace Pf2eModel.Migrations
name: "trainings", name: "trainings",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "jsonb", nullable: false), name = table.Column<string>(type: "jsonb", nullable: false, comment: "Название способности"),
type = table.Column<int>(type: "integer", nullable: false) type = table.Column<int>(type: "integer", nullable: false, comment: "Тип способности")
}, },
constraints: table => constraints: table =>
{ {
@@ -134,9 +134,9 @@ namespace Pf2eModel.Migrations
name: "actions", name: "actions",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false), actions = table.Column<ActionEnum>(type: "action_enum", nullable: false, comment: "Количество действий"),
extra = table.Column<string>(type: "text", nullable: true) extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
}, },
constraints: table => constraints: table =>
{ {
@@ -153,11 +153,11 @@ namespace Pf2eModel.Migrations
name: "ancestries", name: "ancestries",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
size = table.Column<Size[]>(type: "size[]", nullable: false), size = table.Column<SizeEnum[]>(type: "size_enum[]", nullable: false, comment: "Размеры родословной"),
hp = table.Column<int>(type: "integer", nullable: false), hp = table.Column<int>(type: "integer", nullable: false, comment: "Количество очков здоровья"),
speed = table.Column<int>(type: "integer", nullable: false), speed = table.Column<int>(type: "integer", nullable: false, comment: "Скорость передвижения"),
vision = table.Column<AncestryVision>(type: "ancestry_vision", nullable: false) vision_enum = table.Column<VisionEnum>(type: "vision_enum", nullable: false, comment: "Тип зрения")
}, },
constraints: table => constraints: table =>
{ {
@@ -174,7 +174,7 @@ namespace Pf2eModel.Migrations
name: "backgrounds", name: "backgrounds",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
}, },
constraints: table => constraints: table =>
{ {
@@ -191,12 +191,11 @@ namespace Pf2eModel.Migrations
name: "classes", name: "classes",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
hp = table.Column<int>(type: "integer", nullable: false), hp = table.Column<int>(type: "integer", nullable: false, comment: "Количество очков здоровья"),
perception = table.Column<int>(type: "integer", nullable: false), spellcasting = table.Column<bool>(type: "boolean", nullable: false, comment: "Заклинатель?"),
spellcasting = table.Column<bool>(type: "boolean", nullable: false), tradition = table.Column<SpellTradition>(type: "spell_tradition", nullable: true, comment: "Традиция заклинаний"),
tradition = table.Column<SpellTradition>(type: "spell_tradition", nullable: false), additional_trained_skills = table.Column<int>(type: "integer", nullable: false, comment: "Дополнительные навыки")
additional_trained_skills = table.Column<int>(type: "integer", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@@ -213,9 +212,9 @@ namespace Pf2eModel.Migrations
name: "conditions", name: "conditions",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
group = table.Column<ConditionGroup>(type: "condition_group", nullable: true), group = table.Column<ConditionGroup>(type: "condition_group", nullable: true, comment: "Группа состояния"),
extra = table.Column<string>(type: "text", nullable: true) extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
}, },
constraints: table => constraints: table =>
{ {
@@ -232,11 +231,11 @@ namespace Pf2eModel.Migrations
name: "deities", name: "deities",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
category = table.Column<DeityCategory>(type: "deity_category", nullable: false), category = table.Column<DeityCategory>(type: "deity_category", nullable: false, comment: "Тип божества"),
fonts = table.Column<DeityFonts>(type: "deity_fonts", nullable: false), fonts = table.Column<DeityFonts>(type: "deity_fonts", nullable: false, comment: "Тип божественной силы"),
sanctification = table.Column<DeitySanctification>(type: "deity_sanctification", nullable: false), sanctification = table.Column<DeitySanctification>(type: "deity_sanctification", nullable: false, comment: "Тип освящения"),
sanctification_must = table.Column<bool>(type: "boolean", nullable: false) sanctification_must = table.Column<bool>(type: "boolean", nullable: false, comment: "Обязательное освящение")
}, },
constraints: table => constraints: table =>
{ {
@@ -253,15 +252,15 @@ namespace Pf2eModel.Migrations
name: "feats", name: "feats",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
category = table.Column<ActionCategory>(type: "action_category", nullable: false), category = table.Column<FeatCategory>(type: "feat_category", nullable: false, comment: "Категория способности"),
level = table.Column<int>(type: "integer", nullable: false), level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень способности"),
actions = table.Column<int>(type: "integer", nullable: true), actions = table.Column<int>(type: "integer", nullable: true, comment: "Количество действий"),
max_actions = table.Column<int>(type: "integer", nullable: true), max_actions = table.Column<int>(type: "integer", nullable: true),
is_reaction = table.Column<bool>(type: "boolean", nullable: false), is_reaction = table.Column<bool>(type: "boolean", nullable: false),
is_free_action = table.Column<bool>(type: "boolean", nullable: false), is_free_action = table.Column<bool>(type: "boolean", nullable: false),
is_passive = table.Column<bool>(type: "boolean", nullable: false), is_passive = table.Column<bool>(type: "boolean", nullable: false),
extra = table.Column<string>(type: "text", nullable: true) extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
}, },
constraints: table => constraints: table =>
{ {
@@ -278,8 +277,7 @@ namespace Pf2eModel.Migrations
name: "languages", name: "languages",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
entity_id = table.Column<int>(type: "integer", nullable: false) entity_id = table.Column<int>(type: "integer", nullable: false)
}, },
constraints: table => constraints: table =>
@@ -297,21 +295,21 @@ namespace Pf2eModel.Migrations
name: "rituals", name: "rituals",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
level = table.Column<int>(type: "integer", nullable: false), level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень ритуала"),
cast_time = table.Column<int>(type: "integer", nullable: false, comment: "Продолжительность ритуала в секундах"), cast_time = table.Column<int>(type: "integer", nullable: false, comment: "Продолжительность ритуала в секундах"),
duration = table.Column<int>(type: "integer", nullable: false, comment: "Время действия эффекта ритуала в секундах"), duration = table.Column<int>(type: "integer", nullable: false, comment: "Время действия эффекта ритуала в секундах"),
elements = table.Column<int[]>(type: "integer[]", nullable: false), elements = table.Column<ElementEnum[]>(type: "element_enum[]", nullable: false, comment: "Элементы ритуала"),
range = table.Column<int>(type: "integer", nullable: false), range = table.Column<int>(type: "integer", nullable: false, comment: "Дальнность ритуала"),
primary_check_rank = table.Column<TrainingRank>(type: "training_rank", nullable: false), primary_check_rank = table.Column<TrainingRank>(type: "training_rank", nullable: false, comment: "Ранг основной проверки"),
primary_check_suffix = table.Column<string>(type: "jsonb", nullable: true), primary_check_suffix = table.Column<string>(type: "jsonb", nullable: true, comment: "Дополнительная информация об основной проверки"),
secondary_casters = table.Column<int>(type: "integer", nullable: false), secondary_casters = table.Column<int>(type: "integer", nullable: false, comment: "Количество дополнительных заклинателей"),
secondary_casters_max = table.Column<int>(type: "integer", nullable: false), secondary_casters_max = table.Column<int>(type: "integer", nullable: false, comment: "Максимальное количество дополнительных заклинателей"),
secondary_casters_suffix = table.Column<string>(type: "jsonb", nullable: true), secondary_casters_suffix = table.Column<string>(type: "jsonb", nullable: true, comment: "Дополнительная информация о дополнительных заклинателях"),
range_string = table.Column<string>(type: "jsonb", nullable: true), range_string = table.Column<string>(type: "jsonb", nullable: true, comment: "Дальность ритуала"),
target = table.Column<string>(type: "jsonb", nullable: true), target = table.Column<string>(type: "jsonb", nullable: true, comment: "Цель ритуала"),
cost = table.Column<string>(type: "jsonb", nullable: true), cost = table.Column<string>(type: "jsonb", nullable: true, comment: "Стоимость ритуала"),
requirement = table.Column<string>(type: "jsonb", nullable: true) requirement = table.Column<string>(type: "jsonb", nullable: true, comment: "Требования к ритуалу")
}, },
constraints: table => constraints: table =>
{ {
@@ -328,9 +326,9 @@ namespace Pf2eModel.Migrations
name: "rules", name: "rules",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
order = table.Column<int>(type: "integer", nullable: false), order = table.Column<int>(type: "integer", nullable: false, comment: "Порядок отображения"),
parent_id = table.Column<int>(type: "integer", nullable: true), parent_id = table.Column<int>(type: "integer", nullable: true, comment: "Родительского правило"),
breadcrumbs = table.Column<string[]>(type: "text[]", nullable: false) breadcrumbs = table.Column<string[]>(type: "text[]", nullable: false)
}, },
constraints: table => constraints: table =>
@@ -353,18 +351,18 @@ namespace Pf2eModel.Migrations
name: "spells", name: "spells",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
level = table.Column<int>(type: "integer", nullable: false), level = table.Column<int>(type: "integer", nullable: false),
is_focus = table.Column<bool>(type: "boolean", nullable: false), is_focus = table.Column<bool>(type: "boolean", nullable: false, comment: "Фокус?"),
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false), actions = table.Column<ActionEnum>(type: "action_enum", nullable: false, comment: "Количество действий"),
duration = table.Column<int>(type: "integer", maxLength: 255, nullable: true), duration = table.Column<int>(type: "integer", maxLength: 255, nullable: true, comment: "Время длительности заклинания"),
range = table.Column<int>(type: "integer", nullable: false), range = table.Column<int>(type: "integer", nullable: false, comment: "Дальность заклинания"),
traditions = table.Column<SpellTradition[]>(type: "spell_tradition[]", nullable: false), traditions = table.Column<SpellTradition[]>(type: "spell_tradition[]", nullable: false, comment: "Традиции заклинания"),
elements = table.Column<int[]>(type: "integer[]", nullable: false), elements = table.Column<ElementEnum[]>(type: "element_enum[]", nullable: false, comment: "Элементы заклинания"),
trigger = table.Column<string>(type: "jsonb", nullable: true), trigger = table.Column<string>(type: "jsonb", nullable: true, comment: "Триггер заклинания"),
target = table.Column<string>(type: "jsonb", nullable: true), target = table.Column<string>(type: "jsonb", nullable: true, comment: "Цель заклинания"),
cost = table.Column<string>(type: "jsonb", nullable: true), cost = table.Column<string>(type: "jsonb", nullable: true, comment: "Стоимость заклинания"),
requirement = table.Column<string>(type: "jsonb", nullable: true) requirement = table.Column<string>(type: "jsonb", nullable: true, comment: "Требования к заклинанию")
}, },
constraints: table => constraints: table =>
{ {
@@ -381,8 +379,8 @@ namespace Pf2eModel.Migrations
name: "traits", name: "traits",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
type = table.Column<TraitType>(type: "trait_type", nullable: false) type = table.Column<TraitType>(type: "trait_type", nullable: false, comment: "Тип признака")
}, },
constraints: table => constraints: table =>
{ {
@@ -399,10 +397,10 @@ namespace Pf2eModel.Migrations
name: "entity_externals", name: "entity_externals",
columns: table => new columns: table => new
{ {
entity_id = table.Column<int>(type: "integer", nullable: false), entity_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор сущности"),
target_id = table.Column<int>(type: "integer", nullable: false), target_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор цели"),
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть URL до объекта. Для источников Foundry - полный UUID объекта"), suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть URL до объекта. Для источников Foundry - полный UUID объекта"),
md5 = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "Контроль версии объекта") md5 = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "Контрольная сумма объекта")
}, },
constraints: table => constraints: table =>
{ {
@@ -449,10 +447,10 @@ namespace Pf2eModel.Migrations
name: "keyword_aliases", name: "keyword_aliases",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
keyword_id = table.Column<int>(type: "integer", nullable: false), keyword_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор ключевого слова"),
value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false) value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Синоним")
}, },
constraints: table => constraints: table =>
{ {
@@ -469,10 +467,10 @@ namespace Pf2eModel.Migrations
name: "entity_sources", name: "entity_sources",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false) id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
entity_id = table.Column<int>(type: "integer", nullable: false), entity_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор сущности"),
source_id = table.Column<int>(type: "integer", nullable: false), source_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор источника"),
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Номер страницы, эррата и т.д."), suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Номер страницы, эррата и т.д."),
is_remaster = table.Column<bool>(type: "boolean", nullable: false, comment: "Флаг, указывающий, что объект является частью ремастера") is_remaster = table.Column<bool>(type: "boolean", nullable: false, comment: "Флаг, указывающий, что объект является частью ремастера")
}, },
@@ -543,8 +541,8 @@ namespace Pf2eModel.Migrations
name: "heritages", name: "heritages",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
ancestry_id = table.Column<int>(type: "integer", nullable: true) ancestry_id = table.Column<int>(type: "integer", nullable: true, comment: "Идентификатор родословной")
}, },
constraints: table => constraints: table =>
{ {
@@ -713,8 +711,8 @@ namespace Pf2eModel.Migrations
name: "subclass_groups", name: "subclass_groups",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
class_id = table.Column<int>(type: "integer", nullable: true) class_id = table.Column<int>(type: "integer", nullable: true, comment: "Идентификатор класса")
}, },
constraints: table => constraints: table =>
{ {
@@ -820,10 +818,10 @@ namespace Pf2eModel.Migrations
name: "archetypes", name: "archetypes",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
level = table.Column<int>(type: "integer", nullable: false), level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень"),
dedication_feat_id = table.Column<int>(type: "integer", nullable: true), dedication_feat_id = table.Column<int>(type: "integer", nullable: true, comment: "ID посвящения"),
extra = table.Column<string>(type: "text", nullable: true) extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
}, },
constraints: table => constraints: table =>
{ {
@@ -1059,9 +1057,9 @@ namespace Pf2eModel.Migrations
name: "subclasses", name: "subclasses",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
group_id = table.Column<int>(type: "integer", nullable: false), group_id = table.Column<int>(type: "integer", nullable: false, comment: "Группа подклассов"),
additional = table.Column<string>(type: "jsonb", nullable: false), additional = table.Column<string>(type: "jsonb", nullable: false, comment: "Дополнительная информация"),
extra = table.Column<string>(type: "text", nullable: false) extra = table.Column<string>(type: "text", nullable: false)
}, },
constraints: table => constraints: table =>
+227 -141
View File
@@ -21,28 +21,28 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4") .HasAnnotation("ProductVersion", "9.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "archetype", "class-feature", "class-feat", "offensive", "defensive", "interaction", "familiar", "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "archetype", "army_tactic", "army_war_action", "class-feat", "class-feature", "defensive", "familiar", "interaction", "kingdom_activity", "kingdom_feat", "kingdom_feature", "offensive", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "unknown", "1", "2", "3", "reaction", "free", "passive", "other", "1-3", "1-2", "2-3", "2/2 rounds", "reaction/1", "reaction/2", "reaction/3", "free/1", "1 minute", "5 minutes", "10 minutes", "30 minutes", "1 hour" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "1", "1 hour", "1 minute", "1-2", "1-3", "10 minutes", "2", "2-3", "2/2 rounds", "3", "30 minutes", "5 minutes", "free", "free/1", "other", "passive", "reaction", "reaction/1", "reaction/2", "reaction/3", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "cha", "con", "dex", "free", "int", "str", "wis" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "ancestry_feat", "attribute_increase", "class_feat", "entity", "general_feat", "skill_feat", "skill_increase" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "abilities", "attitudes", "death", "detection", "senses", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "unknown", "senses", "abilities", "death", "attitudes", "detection" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "covenant", "deity", "pantheon", "philosophy" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "any", "harm", "heal", "none" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "any", "holy", "unholy" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "element_enum", new[] { "air", "earth", "fire", "metal", "universal", "water", "wood" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "rare", "uncommon", "unique" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "language", "ritual", "rule", "spell", "subclass", "subclass_group", "trait", "unknown" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestry", "ancestry-feature", "archetype", "bonus", "calling", "campaign-feature", "class", "class-feature", "curse", "deityboon", "general", "pfsboon", "skill", "uncategorized" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "hobby", "legacy", "legacy_english", "other", "russian" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size_enum", new[] { "huge", "large", "medium", "small", "tiny" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "adventure-path", "adventures", "blog-posts", "comics", "lost-omens", "rulebook", "society" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "society" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "circle", "cone", "cube", "cuboid", "cylinder", "emanation", "line", "other", "square", "varies" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder", "varies", "cuboid", "circle", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "normal", "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "any", "damage", "healing" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "all", "arcane", "divine", "elemental", "none", "occult", "primal" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "expert", "legendary", "master", "mythic", "trained", "untrained" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "untrained", "trained", "expert", "master", "legendary", "mythic" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "class", "regular", "tradition" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "vision_enum", new[] { "dark-vision", "low-light-vision", "normal" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("DeityTraining", b => modelBuilder.Entity("DeityTraining", b =>
@@ -117,7 +117,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("description") .HasColumnName("description")
.HasColumnOrder(6) .HasColumnOrder(6)
.HasComment("Текстовое описание объекта"); .HasComment("Текстовое описание сущности");
b.Property<string>("Img") b.Property<string>("Img")
.IsRequired() .IsRequired()
@@ -131,13 +131,13 @@ namespace Pf2eModel.Migrations
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_checked") .HasColumnName("is_checked")
.HasColumnOrder(9) .HasColumnOrder(9)
.HasComment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи"); .HasComment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи");
b.Property<bool?>("IsTranslated") b.Property<bool?>("IsTranslated")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_translated") .HasColumnName("is_translated")
.HasColumnOrder(8) .HasColumnOrder(8)
.HasComment("Флаг, указывающий, что у объекта существует перевод"); .HasComment("Флаг, указывающий, что у сущности существует перевод");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
@@ -149,7 +149,8 @@ namespace Pf2eModel.Migrations
b.Property<EntityRarity>("Rarity") b.Property<EntityRarity>("Rarity")
.HasColumnType("entity_rarity") .HasColumnType("entity_rarity")
.HasColumnName("rarity") .HasColumnName("rarity")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Редкость сущности");
b.Property<string>("Slug") b.Property<string>("Slug")
.IsRequired() .IsRequired()
@@ -163,7 +164,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("entity_type") .HasColumnType("entity_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3) .HasColumnOrder(3)
.HasComment("Тип объекта"); .HasComment("Тип сущности");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_entities"); .HasName("pk_entities");
@@ -185,14 +186,16 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<string>("Slug") b.Property<string>("Slug")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("slug") .HasColumnName("slug")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Часть имени в URL");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_keywords"); .HasName("pk_keywords");
@@ -206,21 +209,24 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("KeywordId") b.Property<int>("KeywordId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("keyword_id") .HasColumnName("keyword_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор ключевого слова");
b.Property<string>("Value") b.Property<string>("Value")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("value") .HasColumnName("value")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Синоним");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_keyword_aliases"); .HasName("pk_keyword_aliases");
@@ -237,14 +243,16 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(0); .HasColumnOrder(0)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор сущности");
b.Property<bool>("IsRemaster") b.Property<bool>("IsRemaster")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -255,7 +263,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("SourceId") b.Property<int>("SourceId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("source_id") .HasColumnName("source_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор источника");
b.Property<string>("Suffix") b.Property<string>("Suffix")
.IsRequired() .IsRequired()
@@ -283,26 +292,30 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<SourceCategory>("Category") b.Property<SourceCategory>("Category")
.HasColumnType("source_category") .HasColumnType("source_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Категория источника");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<DateOnly?>("ReleaseDate") b.Property<DateOnly?>("ReleaseDate")
.HasColumnType("date") .HasColumnType("date")
.HasColumnName("release_date") .HasColumnName("release_date")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Дата выхода источника");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_sources"); .HasName("pk_sources");
@@ -315,12 +328,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор сущности");
b.Property<int>("TargetId") b.Property<int>("TargetId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("target_id") .HasColumnName("target_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор цели");
b.Property<string>("Md5") b.Property<string>("Md5")
.IsRequired() .IsRequired()
@@ -328,7 +343,7 @@ namespace Pf2eModel.Migrations
.HasColumnType("character varying(32)") .HasColumnType("character varying(32)")
.HasColumnName("md5") .HasColumnName("md5")
.HasColumnOrder(5) .HasColumnOrder(5)
.HasComment("Контроль версии объекта"); .HasComment("Контрольная сумма объекта");
b.Property<string>("Suffix") b.Property<string>("Suffix")
.IsRequired() .IsRequired()
@@ -353,7 +368,8 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
@@ -362,21 +378,24 @@ namespace Pf2eModel.Migrations
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("icon") .HasColumnName("icon")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Иконка цели");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Отображаемое имя");
b.Property<string>("Prefix") b.Property<string>("Prefix")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("prefix") .HasColumnName("prefix")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Префикс для URL-адреса внешней ссылки");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_external_targets"); .HasName("pk_external_targets");
@@ -390,24 +409,28 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Max") b.Property<int>("Max")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("max") .HasColumnName("max")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Максимальная продолжительсность");
b.Property<int>("Per") b.Property<int>("Per")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("per") .HasColumnName("per")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Частота использования");
b.Property<int?>("Value") b.Property<int?>("Value")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("value") .HasColumnName("value")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Значение использования");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_frequencies"); .HasName("pk_frequencies");
@@ -421,7 +444,8 @@ namespace Pf2eModel.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
@@ -429,12 +453,14 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("name") .HasColumnName("name")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Название способности");
b.Property<int>("Type") b.Property<int>("Type")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Тип способности");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_trainings"); .HasName("pk_trainings");
@@ -447,17 +473,20 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<ActionEnum>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("action_enum") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Количество действий");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_actions"); .HasName("pk_actions");
@@ -470,28 +499,33 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("Hp") b.Property<int>("Hp")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("hp") .HasColumnName("hp")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Количество очков здоровья");
b.PrimitiveCollection<Size[]>("Size") b.PrimitiveCollection<SizeEnum[]>("Size")
.IsRequired() .IsRequired()
.HasColumnType("size[]") .HasColumnType("size_enum[]")
.HasColumnName("size") .HasColumnName("size")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Размеры родословной");
b.Property<int>("Speed") b.Property<int>("Speed")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("speed") .HasColumnName("speed")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Скорость передвижения");
b.Property<AncestryVision>("Vision") b.Property<VisionEnum>("VisionEnum")
.HasColumnType("ancestry_vision") .HasColumnType("vision_enum")
.HasColumnName("vision") .HasColumnName("vision_enum")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Тип зрения");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_ancestries"); .HasName("pk_ancestries");
@@ -590,22 +624,26 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("DedicationFeatId") b.Property<int?>("DedicationFeatId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("dedication_feat_id") .HasColumnName("dedication_feat_id")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("ID посвящения");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Дополнительная информация");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Уровень");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_archetypes"); .HasName("pk_archetypes");
@@ -641,7 +679,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_backgrounds"); .HasName("pk_backgrounds");
@@ -743,32 +782,32 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("AdditionalTrainedSkills") b.Property<int>("AdditionalTrainedSkills")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("additional_trained_skills") .HasColumnName("additional_trained_skills")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Дополнительные навыки");
b.Property<int>("Hp") b.Property<int>("Hp")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("hp") .HasColumnName("hp")
.HasColumnOrder(3); .HasColumnOrder(2)
.HasComment("Количество очков здоровья");
b.Property<int>("Perception")
.HasColumnType("integer")
.HasColumnName("perception")
.HasColumnOrder(4);
b.Property<bool>("Spellcasting") b.Property<bool>("Spellcasting")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("spellcasting") .HasColumnName("spellcasting")
.HasColumnOrder(5); .HasColumnOrder(3)
.HasComment("Заклинатель?");
b.Property<SpellTradition>("Tradition") b.Property<SpellTradition?>("Tradition")
.HasColumnType("spell_tradition") .HasColumnType("spell_tradition")
.HasColumnName("tradition") .HasColumnName("tradition")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Традиция заклинаний");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_classes"); .HasName("pk_classes");
@@ -945,17 +984,20 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.Property<ConditionGroup?>("Group") b.Property<ConditionGroup?>("Group")
.HasColumnType("condition_group") .HasColumnType("condition_group")
.HasColumnName("group") .HasColumnName("group")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Группа состояния");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_conditions"); .HasName("pk_conditions");
@@ -968,27 +1010,32 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<DeityCategory>("Category") b.Property<DeityCategory>("Category")
.HasColumnType("deity_category") .HasColumnType("deity_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Тип божества");
b.Property<DeityFonts>("Fonts") b.Property<DeityFonts>("Fonts")
.HasColumnType("deity_fonts") .HasColumnType("deity_fonts")
.HasColumnName("fonts") .HasColumnName("fonts")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Тип божественной силы");
b.Property<DeitySanctification>("Sanctification") b.Property<DeitySanctification>("Sanctification")
.HasColumnType("deity_sanctification") .HasColumnType("deity_sanctification")
.HasColumnName("sanctification") .HasColumnName("sanctification")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Тип освящения");
b.Property<bool>("SanctificationMust") b.Property<bool>("SanctificationMust")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("sanctification_must") .HasColumnName("sanctification_must")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Обязательное освящение");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_deities"); .HasName("pk_deities");
@@ -1123,22 +1170,26 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("Actions") b.Property<int?>("Actions")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Количество действий");
b.Property<ActionCategory>("Category") b.Property<FeatCategory>("Category")
.HasColumnType("action_category") .HasColumnType("feat_category")
.HasColumnName("category") .HasColumnName("category")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Категория способности");
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Дополнительная информация");
b.Property<bool>("IsFreeAction") b.Property<bool>("IsFreeAction")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -1158,7 +1209,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Уровень способности");
b.Property<int?>("MaxActions") b.Property<int?>("MaxActions")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1207,12 +1259,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("AncestryId") b.Property<int?>("AncestryId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("ancestry_id") .HasColumnName("ancestry_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор родословной");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_heritages"); .HasName("pk_heritages");
@@ -1226,12 +1280,10 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1251,7 +1303,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int>("CastTime") b.Property<int>("CastTime")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1262,7 +1315,8 @@ namespace Pf2eModel.Migrations
b.Property<string>("Cost") b.Property<string>("Cost")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("cost") .HasColumnName("cost")
.HasColumnOrder(14); .HasColumnOrder(14)
.HasComment("Стоимость ритуала");
b.Property<int>("Duration") b.Property<int>("Duration")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1270,61 +1324,72 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(4) .HasColumnOrder(4)
.HasComment("Время действия эффекта ритуала в секундах"); .HasComment("Время действия эффекта ритуала в секундах");
b.PrimitiveCollection<int[]>("Elements") b.PrimitiveCollection<ElementEnum[]>("Elements")
.IsRequired() .IsRequired()
.HasColumnType("integer[]") .HasColumnType("element_enum[]")
.HasColumnName("elements") .HasColumnName("elements")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Элементы ритуала");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Уровень ритуала");
b.Property<TrainingRank>("PrimaryCheckRank") b.Property<TrainingRank>("PrimaryCheckRank")
.HasColumnType("training_rank") .HasColumnType("training_rank")
.HasColumnName("primary_check_rank") .HasColumnName("primary_check_rank")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Ранг основной проверки");
b.Property<string>("PrimaryCheckSuffix") b.Property<string>("PrimaryCheckSuffix")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("primary_check_suffix") .HasColumnName("primary_check_suffix")
.HasColumnOrder(8); .HasColumnOrder(8)
.HasComment("Дополнительная информация об основной проверки");
b.Property<int>("Range") b.Property<int>("Range")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Дальнность ритуала");
b.Property<string>("RangeString") b.Property<string>("RangeString")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("range_string") .HasColumnName("range_string")
.HasColumnOrder(12); .HasColumnOrder(12)
.HasComment("Дальность ритуала");
b.Property<string>("Requirement") b.Property<string>("Requirement")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("requirement") .HasColumnName("requirement")
.HasColumnOrder(15); .HasColumnOrder(15)
.HasComment("Требования к ритуалу");
b.Property<int>("SecondaryCasters") b.Property<int>("SecondaryCasters")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("secondary_casters") .HasColumnName("secondary_casters")
.HasColumnOrder(9); .HasColumnOrder(9)
.HasComment("Количество дополнительных заклинателей");
b.Property<int>("SecondaryCastersMax") b.Property<int>("SecondaryCastersMax")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("secondary_casters_max") .HasColumnName("secondary_casters_max")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Максимальное количество дополнительных заклинателей");
b.Property<string>("SecondaryCastersSuffix") b.Property<string>("SecondaryCastersSuffix")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("secondary_casters_suffix") .HasColumnName("secondary_casters_suffix")
.HasColumnOrder(11); .HasColumnOrder(11)
.HasComment("Дополнительная информация о дополнительных заклинателях");
b.Property<string>("Target") b.Property<string>("Target")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(13); .HasColumnOrder(13)
.HasComment("Цель ритуала");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_rituals"); .HasName("pk_rituals");
@@ -1408,7 +1473,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.PrimitiveCollection<string[]>("Breadcrumbs") b.PrimitiveCollection<string[]>("Breadcrumbs")
.IsRequired() .IsRequired()
@@ -1418,12 +1484,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Order") b.Property<int>("Order")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("order") .HasColumnName("order")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Порядок отображения");
b.Property<int?>("ParentId") b.Property<int?>("ParentId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("parent_id") .HasColumnName("parent_id")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Родительского правило");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_rules"); .HasName("pk_rules");
@@ -1439,34 +1507,40 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<ActionEnum>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("action_enum") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(4); .HasColumnOrder(4)
.HasComment("Количество действий");
b.Property<string>("Cost") b.Property<string>("Cost")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("cost") .HasColumnName("cost")
.HasColumnOrder(11); .HasColumnOrder(11)
.HasComment("Стоимость заклинания");
b.Property<int?>("Duration") b.Property<int?>("Duration")
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("duration") .HasColumnName("duration")
.HasColumnOrder(5); .HasColumnOrder(5)
.HasComment("Время длительности заклинания");
b.PrimitiveCollection<int[]>("Elements") b.PrimitiveCollection<ElementEnum[]>("Elements")
.IsRequired() .IsRequired()
.HasColumnType("integer[]") .HasColumnType("element_enum[]")
.HasColumnName("elements") .HasColumnName("elements")
.HasColumnOrder(8); .HasColumnOrder(8)
.HasComment("Элементы заклинания");
b.Property<bool>("IsFocus") b.Property<bool>("IsFocus")
.HasColumnType("boolean") .HasColumnType("boolean")
.HasColumnName("is_focus") .HasColumnName("is_focus")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Фокус?");
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
@@ -1476,28 +1550,33 @@ namespace Pf2eModel.Migrations
b.Property<int>("Range") b.Property<int>("Range")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(6); .HasColumnOrder(6)
.HasComment("Дальность заклинания");
b.Property<string>("Requirement") b.Property<string>("Requirement")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("requirement") .HasColumnName("requirement")
.HasColumnOrder(12); .HasColumnOrder(12)
.HasComment("Требования к заклинанию");
b.Property<string>("Target") b.Property<string>("Target")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(10); .HasColumnOrder(10)
.HasComment("Цель заклинания");
b.PrimitiveCollection<SpellTradition[]>("Traditions") b.PrimitiveCollection<SpellTradition[]>("Traditions")
.IsRequired() .IsRequired()
.HasColumnType("spell_tradition[]") .HasColumnType("spell_tradition[]")
.HasColumnName("traditions") .HasColumnName("traditions")
.HasColumnOrder(7); .HasColumnOrder(7)
.HasComment("Традиции заклинания");
b.Property<string>("Trigger") b.Property<string>("Trigger")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("trigger") .HasColumnName("trigger")
.HasColumnOrder(9); .HasColumnOrder(9)
.HasComment("Триггер заклинания");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_spells"); .HasName("pk_spells");
@@ -1652,13 +1731,15 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<string>("Additional") b.Property<string>("Additional")
.IsRequired() .IsRequired()
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("additional") .HasColumnName("additional")
.HasColumnOrder(3); .HasColumnOrder(3)
.HasComment("Дополнительная информация");
b.Property<string>("Extra") b.Property<string>("Extra")
.IsRequired() .IsRequired()
@@ -1669,7 +1750,8 @@ namespace Pf2eModel.Migrations
b.Property<int>("GroupId") b.Property<int>("GroupId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("group_id") .HasColumnName("group_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Группа подклассов");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_subclasses"); .HasName("pk_subclasses");
@@ -1685,12 +1767,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<int?>("ClassId") b.Property<int?>("ClassId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("class_id") .HasColumnName("class_id")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Идентификатор класса");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_subclass_groups"); .HasName("pk_subclass_groups");
@@ -1706,12 +1790,14 @@ namespace Pf2eModel.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1)
.HasComment("Идентификатор");
b.Property<TraitType>("Type") b.Property<TraitType>("Type")
.HasColumnType("trait_type") .HasColumnType("trait_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(2); .HasColumnOrder(2)
.HasComment("Тип признака");
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_traits"); .HasName("pk_traits");
+51 -9
View File
@@ -10,51 +10,93 @@ using Pf2eModel.Model.Structure;
namespace Pf2eModel.Model.Base; namespace Pf2eModel.Model.Base;
/// <summary>
/// Корневая сущность.
/// </summary>
public class Entity public class Entity
{ {
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Key] [Key]
[Column(Order = 1)] [Column(Order = 1)]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Отображаемое имя сущности.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Отображаемое имя")] [Comment("Отображаемое имя")]
public LocaleString Name { get; set; } = []; public LocaleString Name { get; set; } = [];
/// <summary>
/// Тип сущности.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Тип объекта")] [Comment("Тип сущности")]
public EntityType Type { get; set; } public EntityType Type { get; set; }
/// <summary>
/// Часть имени в URL.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[MaxLength(Pf2eDbContext.NameLength)] [MaxLength(Pf2eDbContext.NameLength)]
[Comment("Часть имени в URL")] [Comment("Часть имени в URL")]
public string Slug { get; set; } = null!; public string Slug { get; set; } = null!;
/// <summary>
/// Изображение сущности.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
[StringLength(255)] [StringLength(255)]
[Comment("Изображение объекта")] [Comment("Изображение объекта")]
public string Img { get; set; } = null!; public string Img { get; set; } = null!;
/// <summary>
/// Текстовое описание сущности.
/// </summary>
[Column(Order = 6)] [Column(Order = 6)]
[Comment("Текстовое описание объекта")] [Comment("Текстовое описание сущности")]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
public string Description { get; set; } = null!; public string Description { get; set; } = null!;
/// <summary>
/// Редкость сущности.
/// </summary>
[Column(Order = 7)] [Column(Order = 7)]
[Comment("Редкость сущности")]
public EntityRarity Rarity { get; set; } = EntityRarity.Common; public EntityRarity Rarity { get; set; } = EntityRarity.Common;
/// <summary>
/// Флаг, указывающий, что у объекта существует перевод.
/// </summary>
[Column(Order = 8)] [Column(Order = 8)]
[Comment("Флаг, указывающий, что у объекта существует перевод")] [Comment("Флаг, указывающий, что у сущности существует перевод")]
public bool? IsTranslated { get; set; } = false; public bool? IsTranslated { get; set; } = false;
/// <summary>
/// Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи.
/// </summary>
[Column(Order = 9)] [Column(Order = 9)]
[Comment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи")] [Comment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи")]
public bool? IsChecked { get; set; } = false; public bool? IsChecked { get; set; } = false;
public virtual ICollection<Trait> Traits { get; set; } = []; /// <summary>
/// Коллекция признаков, связанных с сущностью.
/// </summary>
public ICollection<Trait> Traits { get; set; } = [];
public virtual ICollection<Keyword> Keywords { get; set; } = []; /// <summary>
/// Коллекция ключевых слов, связанных с сущностью.
/// </summary>
public ICollection<Keyword> Keywords { get; set; } = [];
public virtual ICollection<EntitySource> Sources { get; set; } = []; /// <summary>
/// Коллекция источников, связанных с сущностью.
/// </summary>
public ICollection<EntitySource> Sources { get; set; } = [];
public virtual ICollection<EntityExternal> Externals { get; set; } = []; /// <summary>
/// Коллекция внешних ссылок, связанных с сущностью.
/// </summary>
public ICollection<EntityExternal> Externals { get; set; } = [];
} }
+21 -1
View File
@@ -1,25 +1,45 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Common.I18n; using Pf2eModel.Model.Common.I18n;
namespace Pf2eModel.Model.Base.Keywords; namespace Pf2eModel.Model.Base.Keywords;
/// <summary>
/// Ключевое слово.
/// </summary>
public class Keyword public class Keyword
{ {
/// <summary>
/// Идентификатор.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Отображаемое имя ключевого слова.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Отображаемое имя")]
public LocaleString Name = []; public LocaleString Name = [];
/// <summary>
/// Часть имени в URL.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[MaxLength(Pf2eDbContext.NameLength)] [MaxLength(Pf2eDbContext.NameLength)]
[Comment("Часть имени в URL")]
public string Slug { get; set; } = null!; public string Slug { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore] /// <summary>
/// Коллекция сущностей, которые используют это ключевое слово.
/// </summary>
public ICollection<Entity> Entities { get; set; } = []; public ICollection<Entity> Entities { get; set; } = [];
/// <summary>
/// Коллекция синонимов ключевого слова.
/// </summary>
public ICollection<KeywordAlias> Aliases { get; set; } = []; public ICollection<KeywordAlias> Aliases { get; set; } = [];
} }
+19 -1
View File
@@ -1,22 +1,40 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Keywords; namespace Pf2eModel.Model.Base.Keywords;
/// <summary>
/// Синоним ключевого слова.
/// </summary>
public class KeywordAlias public class KeywordAlias
{ {
/// <summary>
/// Идентификатор.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Идентификатор связаннного ключевого слова.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Идентификатор ключевого слова")]
public int KeywordId { get; set; } public int KeywordId { get; set; }
/// <summary>
/// Значение синонима ключевого слова.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[MaxLength(Pf2eDbContext.NameLength)] [MaxLength(Pf2eDbContext.NameLength)]
[Comment("Синоним")]
public string Value { get; set; } = null!; public string Value { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore] /// <summary>
/// Ключевое слово, к которому относится синоним.
/// </summary>
public Keyword Keyword { get; set; } = null!; public Keyword Keyword { get; set; } = null!;
} }
+27 -1
View File
@@ -4,30 +4,56 @@ using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Source; namespace Pf2eModel.Model.Base.Source;
/// <summary>
/// Связь между сущностью и источником.
/// </summary>
public class EntitySource public class EntitySource
{ {
/// <summary>
/// Идентификатор связи.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 0)] [Column(Order = 0)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор сущности")]
public int EntityId { get; set; } public int EntityId { get; set; }
/// <summary>
/// Идентификатор источника.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Идентификатор источника")]
public int SourceId { get; set; } public int SourceId { get; set; }
/// <summary>
/// Дополнительная информация о источнике, например, номер страницы, номер тома и т.д.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[MaxLength(255)] [MaxLength(255)]
[Comment("Номер страницы, эррата и т.д.")] [Comment("Номер страницы, эррата и т.д.")]
public string Suffix { get; set; } = null!; public string Suffix { get; set; } = null!;
/// <summary>
/// Флаг, указывающий, что объект является частью ремастера.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Флаг, указывающий, что объект является частью ремастера")] [Comment("Флаг, указывающий, что объект является частью ремастера")]
public bool IsRemaster { get; set; } public bool IsRemaster { get; set; }
[Newtonsoft.Json.JsonIgnore] /// <summary>
/// Сущность, к которой относится источник.
/// </summary>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Источник, к которому относится сущность.
/// </summary>
public Source Source { get; set; } = null!; public Source Source { get; set; } = null!;
} }
+23 -1
View File
@@ -1,26 +1,48 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Base.Source; namespace Pf2eModel.Model.Base.Source;
/// <summary>
/// Источник сущности.
/// </summary>
public class Source public class Source
{ {
/// <summary>
/// Идентификатор источника.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Отображаемое имя источника.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[MaxLength(Pf2eDbContext.NameLength)] [MaxLength(Pf2eDbContext.NameLength)]
[Comment("Отображаемое имя")]
public string Name { get; set; } = null!; public string Name { get; set; } = null!;
/// <summary>
/// Категория источника.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Категория источника")]
public SourceCategory Category { get; set; } public SourceCategory Category { get; set; }
/// <summary>
/// Дата выхода источника.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Дата выхода источника")]
public DateOnly? ReleaseDate { get; set; } public DateOnly? ReleaseDate { get; set; }
[Newtonsoft.Json.JsonIgnore] /// <summary>
/// Связанные сущности.
/// </summary>
public ICollection<EntitySource> EntitySources { get; set; } = []; public ICollection<EntitySource> EntitySources { get; set; } = [];
} }
+27 -4
View File
@@ -4,13 +4,24 @@ using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Targets; namespace Pf2eModel.Model.Base.Targets;
/// <summary>
/// Внешняя ссылка сущности.
/// </summary>
[PrimaryKey(nameof(EntityId), nameof(TargetId))] [PrimaryKey(nameof(EntityId), nameof(TargetId))]
public class EntityExternal public class EntityExternal
{ {
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор сущности")]
public int EntityId { get; set; } public int EntityId { get; set; }
/// <summary>
/// Идентификатор цели.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Идентификатор цели")]
public int TargetId { get; set; } public int TargetId { get; set; }
/* /*
@@ -19,18 +30,30 @@ public class EntityExternal
public string ExternalId { get; set; } = ""; public string ExternalId { get; set; } = "";
*/ */
/// <summary>
/// Конечная часть URL внешней ссылки.
/// Для источников Foundry - полный UUID объекта.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[MaxLength(255)] [MaxLength(255)]
[Comment("Часть URL до объекта. Для источников Foundry - полный UUID объекта")] [Comment("Часть URL до объекта. Для источников Foundry - полный UUID объекта")]
public string Suffix { get; set; } = ""; public string Suffix { get; set; } = "";
/// <summary>
/// Контрольная сумма объекта.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
[MaxLength(32)] [MaxLength(32)]
[Comment("Контроль версии объекта")] [Comment("Контрольная сумма объекта")]
public string Md5 { get; set; } = null!; public string Md5 { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore] /// <summary>
public virtual Entity Entity { get; set; } = null!; /// Сущность, которая ссылается на внешнюю ссылку.
/// </summary>
public Entity Entity { get; set; } = null!;
public virtual ExternalTarget Target { get; set; } = null!; /// <summary>
/// Цель внешней ссылки.
/// </summary>
public ExternalTarget Target { get; set; } = null!;
} }
+23 -2
View File
@@ -1,28 +1,49 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Targets; namespace Pf2eModel.Model.Base.Targets;
/// <summary>
/// Цель внешней ссылки.
/// </summary>
public class ExternalTarget public class ExternalTarget
{ {
/// <summary>
/// Идентификатор цели.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Название цели.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[StringLength(Pf2eDbContext.NameLength)] [StringLength(Pf2eDbContext.NameLength)]
[Comment("Отображаемое имя")]
public string Name { get; set; } = null!; public string Name { get; set; } = null!;
/// <summary>
/// Иконка цели.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[StringLength(255)] [StringLength(255)]
[Comment("Иконка цели")]
public string Icon { get; set; } = null!; public string Icon { get; set; } = null!;
/// <summary>
/// Префикс для URL-адреса внешней ссылки.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[StringLength(Pf2eDbContext.NameLength)] [StringLength(Pf2eDbContext.NameLength)]
[Comment("Префикс для URL-адреса внешней ссылки")]
public string Prefix { get; set; } = null!; public string Prefix { get; set; } = null!;
[Column(Order = 4)] /// <summary>
[Newtonsoft.Json.JsonIgnore] /// Коллекция сущностей, которые ссылаются на эту цель.
/// </summary>
public ICollection<EntityExternal> EntityExternals { get; set; } = []; public ICollection<EntityExternal> EntityExternals { get; set; } = [];
} }
+20
View File
@@ -1,21 +1,41 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Common; namespace Pf2eModel.Model.Common;
/// <summary>
/// Частота использования.
/// </summary>
public class Frequency public class Frequency
{ {
/// <summary>
/// Идентификатор.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Максимальная продолжительсность.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Максимальная продолжительсность")]
public int Max { get; set; } public int Max { get; set; }
/// <summary>
/// Частота использования.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Частота использования")]
public int Per { get; set; } public int Per { get; set; }
/// <summary>
/// Значение использования.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Значение использования")]
public int? Value { get; set; } public int? Value { get; set; }
} }
+17 -2
View File
@@ -3,8 +3,16 @@ using System.Reflection;
namespace Pf2eModel.Model.Common.I18n; namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Расширения для работы с локализацией.
/// </summary>
public static class LocaleExtension public static class LocaleExtension
{ {
/// <summary>
/// Получение строкового представления типа локализации.
/// </summary>
/// <param name="localeType">Тип локализации.</param>
/// <returns>Строковое представление типа локализации.</returns>
public static string GetTypeString(this LocaleType localeType) public static string GetTypeString(this LocaleType localeType)
{ {
FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!; FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!;
@@ -16,7 +24,13 @@ public static class LocaleExtension
?? localeType.ToString(); ?? localeType.ToString();
} }
public static LocaleType GetTypeByString(this string localeType) /// <summary>
/// Получение типа локализации по строковому представлению типа локализации.
/// </summary>
/// <param name="localeTypeString">Строковое представление типа локализации.</param>
/// <returns>Тип локализации.</returns>
/// <exception cref="InvalidEnumArgumentException">Исключение, если строковое представление не соответсвует ни одному типу локализации.</exception>
public static LocaleType GetTypeByString(this string localeTypeString)
{ {
foreach (FieldInfo field in typeof(LocaleType).GetFields()) foreach (FieldInfo field in typeof(LocaleType).GetFields())
{ {
@@ -28,7 +42,7 @@ public static class LocaleExtension
continue; continue;
} }
if (descriptionAttribute.Description == localeType) if (descriptionAttribute.Description == localeTypeString)
{ {
return (LocaleType)field.GetValue(null)!; return (LocaleType)field.GetValue(null)!;
} }
@@ -36,6 +50,7 @@ public static class LocaleExtension
throw new InvalidEnumArgumentException(); throw new InvalidEnumArgumentException();
} }
/* /*
public static IQueryable<T> WhereLocale( public static IQueryable<T> WhereLocale(
this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class
+16 -1
View File
@@ -1,11 +1,26 @@
namespace Pf2eModel.Model.Common.I18n; namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Элемент локализации.
/// </summary>
/// <param name="type">Тип локализации.</param>
/// <param name="value">Значение локализации.</param>
public class LocaleItem(LocaleType type, string value) public class LocaleItem(LocaleType type, string value)
{ {
/// <summary>
/// Тип локализации.
/// </summary>
public LocaleType Locale { get; set; } = type; public LocaleType Locale { get; set; } = type;
/// <summary>
/// Значение локализации.
/// </summary>
public string Value { get; set; } = value; public string Value { get; set; } = value;
/// <summary>
/// Конструктор класса <see cref="LocaleItem"/> по паре ключ-значение.
/// </summary>
/// <param name="item">Пара ключ-значение по строковому представлению типа.</param>
public LocaleItem(KeyValuePair<string, string> item) public LocaleItem(KeyValuePair<string, string> item)
: this(LocaleExtension.GetTypeByString(item.Key), item.Value) { } : this(item.Key.GetTypeByString(), item.Value) { }
} }
+106 -9
View File
@@ -3,40 +3,90 @@ using Newtonsoft.Json.Linq;
namespace Pf2eModel.Model.Common.I18n; namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Локализованная строка.
/// </summary>
public class LocaleString : ICollection<LocaleItem> public class LocaleString : ICollection<LocaleItem>
{ {
/// <summary>
/// Список локализаций строк.
/// </summary>
private readonly List<LocaleItem> _items = []; private readonly List<LocaleItem> _items = [];
/// <summary>
/// Проверяет наличие хотя бы одной локализации.
/// </summary>
private void AssureDefault() private void AssureDefault()
{ {
if (_items.Count == 0) if (_items.Count == 0)
{ {
_items.Add(new LocaleItem(LocaleType.English, string.Empty)); _items.Add(new(LocaleType.English, string.Empty));
} }
} }
/// <summary>
/// Количество локализаций.
/// </summary>
public int Count => _items.Count; public int Count => _items.Count;
public bool IsReadOnly => false; /// <summary>
/// Коллекция реализованных типов локализаций.
/// </summary>
public ICollection<LocaleType> Types => _items.Select(c => c.Locale).ToList(); public ICollection<LocaleType> Types => _items.Select(c => c.Locale).ToList();
/// <inheritdoc/>
public bool IsReadOnly => false;
/// <summary>
/// Конструктор класса <see cref="LocaleString"/>.
/// </summary>
public LocaleString() public LocaleString()
{ {
AssureDefault(); AssureDefault();
} }
private LocaleType _E(string localeString) => LocaleExtension.GetTypeByString(localeString); /// <summary>
/// Получение типа локализации по строковому представлению.
/// </summary>
/// <param name="localeString">Строковое представление.</param>
/// <returns>Тип локализации.</returns>
private LocaleType _E(string localeString) => localeString.GetTypeByString();
/// <summary>
/// Получение типа локализации с учётом её наличия в коллекции.
/// </summary>
/// <param name="locale">Искомый тип локализации.</param>
/// <returns>Реальный тип локализации.</returns>
private LocaleType RealLocale(LocaleType locale) => private LocaleType RealLocale(LocaleType locale) =>
Contains(locale) ? locale : LocaleType.English; Contains(locale) ? locale : LocaleType.English;
/// <summary>
/// Получение типа локализации по строковому представлению с учётом её наличия в коллекции.
/// </summary>
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
/// <returns>Реальный тип локализации.</returns>
private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString)); private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString));
/// <summary>
/// Получение объекта локализованной строки по типу локализации.
/// </summary>
/// <param name="locale">Искомый тип локализации.</param>
/// <returns>Объект локализованной строки.</returns>
public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale)); public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale));
public LocaleItem GetItem(string locale) => this.First(c => c.Locale == RealLocale(locale)); /// <summary>
/// Получение объекта локализованной строки по строковому представлению типа локализации.
/// </summary>
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
/// <returns>Объект локализованной строки.</returns>
public LocaleItem GetItem(string localeString) =>
this.First(c => c.Locale == RealLocale(localeString));
/// <summary>
/// Получение локализованной строки по типу локализации.
/// </summary>
/// <param name="locale">Искомый тип локализации.</param>
/// <returns>Локализованная строка.</returns>
public string this[LocaleType locale] public string this[LocaleType locale]
{ {
get => GetItem(locale).Value; get => GetItem(locale).Value;
@@ -48,52 +98,87 @@ public class LocaleString : ICollection<LocaleItem>
} }
else else
{ {
_items.Add(new LocaleItem(locale, value)); _items.Add(new(locale, value));
} }
} }
} }
/// <summary>
/// Получение локализованной строки по типу локализации.
/// </summary>
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
/// <returns>Локализованная строка.</returns>
public string this[string localeString] public string this[string localeString]
{ {
get => this[_E(localeString)]; get => this[_E(localeString)];
set => this[_E(localeString)] = value; set => this[_E(localeString)] = value;
} }
/// <summary>
/// Добавление объекта локализованной строки в коллекцию.
/// </summary>
/// <param name="item">Объект локализированной строки.</param>
public void Add(LocaleItem item) public void Add(LocaleItem item)
{ {
this[item.Locale] = item.Value; this[item.Locale] = item.Value;
} }
/// <summary>
/// Добавление локализованной строки в коллекцию.
/// </summary>
/// <param name="locale">Тип локализации.</param>
/// <param name="value">Строка локазации.</param>
public void Add(LocaleType locale, string value) public void Add(LocaleType locale, string value)
{ {
this[locale] = value; this[locale] = value;
} }
/// <summary>
/// Отчистка коллекции локализованных строк.
/// </summary>
public void Clear() public void Clear()
{ {
_items.Clear(); _items.Clear();
AssureDefault(); AssureDefault();
} }
/// <summary>
/// Проверка наличия объекта локализованной строки в коллекции.
/// </summary>
/// <param name="item">Объект локализированной строки.</param>
/// <returns>`true`, если объект есть; `false`, если нет.</returns>
public bool Contains(LocaleItem item) public bool Contains(LocaleItem item)
{ {
return _items.Contains(item); return _items.Contains(item);
} }
/// <summary>
/// Проверка наличия локализованной строки в коллекции по типу локализации.
/// </summary>
/// <param name="locale">Тип локализации.</param>
/// <returns>`true`, если искомый тип локализации есть; `false`, если нет.</returns>
public bool Contains(LocaleType locale) public bool Contains(LocaleType locale)
{ {
return Types.Contains(locale); return Types.Contains(locale);
} }
public bool Contains(string value) /// <summary>
/// Проверка наличия локализованной строки в коллекции по строковому представлению типа локализации.
/// </summary>
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
/// <returns>`true`, если искомый тип локализации есть; `false`, если нет.</returns>
public bool Contains(string localeString)
{ {
return this.Any(item => item.Value == value); return this.Any(item => item.Value == localeString);
} }
/// <inheritdoc/>
public void CopyTo(LocaleItem[] array, int arrayIndex) public void CopyTo(LocaleItem[] array, int arrayIndex)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <inheritdoc/>
public bool Remove(LocaleItem item) public bool Remove(LocaleItem item)
{ {
bool result = _items.Remove(item); bool result = _items.Remove(item);
@@ -107,21 +192,28 @@ public class LocaleString : ICollection<LocaleItem>
return result; return result;
} }
/// <inheritdoc/>
public IEnumerator<LocaleItem> GetEnumerator() public IEnumerator<LocaleItem> GetEnumerator()
{ {
return _items.GetEnumerator(); return _items.GetEnumerator();
} }
/// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator()
{ {
return GetEnumerator(); return GetEnumerator();
} }
/// <inheritdoc/>
public override string ToString() public override string ToString()
{ {
return this[LocaleType.English]; return this[LocaleType.English];
} }
/// <summary>
/// Сериализация локализованной строки в JSON-формат.
/// </summary>
/// <returns>Строковое представление JSON-представления.</returns>
public string Serialize() public string Serialize()
{ {
JObject json = []; JObject json = [];
@@ -134,10 +226,15 @@ public class LocaleString : ICollection<LocaleItem>
return json.ToString(); return json.ToString();
} }
/// <summary>
/// Десериализация локализованной строки из JSON-формата.
/// </summary>
/// <param name="input">Строковое представление JSON-представления.</param>
/// <returns>Объект локализованной строки.</returns>
public static LocaleString Deserialize(string input) public static LocaleString Deserialize(string input)
{ {
JObject json = JObject.Parse(input); JObject json = JObject.Parse(input);
LocaleString result = new(); LocaleString result = [];
foreach (KeyValuePair<string, JToken?> item in json) foreach (KeyValuePair<string, JToken?> item in json)
{ {
@@ -2,6 +2,9 @@
namespace Pf2eModel.Model.Common.I18n; namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Тип локализации.
/// </summary>
public enum LocaleType public enum LocaleType
{ {
[Description("en")] [Description("en")]
+16
View File
@@ -1,20 +1,36 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Common.I18n; using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Common; namespace Pf2eModel.Model.Common;
/// <summary>
/// Изучаемая способность.
/// </summary>
public class Training public class Training
{ {
/// <summary>
/// Идентификатор.
/// </summary>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Название способности.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Название способности")]
public LocaleString Name { get; set; } = []; public LocaleString Name { get; set; } = [];
/// <summary>
/// Тип способности.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Тип способности")]
public TrainingType Type { get; set; } public TrainingType Type { get; set; }
} }
+10
View File
@@ -2,10 +2,20 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип действия.
/// </summary>
public enum ActionCategory public enum ActionCategory
{ {
/// <summary>
/// Неизвестный тип действия.
/// </summary>
[PgName("unknown")]
Unknown, Unknown,
/// <summary>
/// Действие архетипа.
/// </summary>
[PgName("archetype")] [PgName("archetype")]
Archetype, Archetype,
+3
View File
@@ -2,6 +2,9 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечиленение количества действий.
/// </summary>
public enum ActionEnum public enum ActionEnum
{ {
[PgName("unknown")] [PgName("unknown")]
-15
View File
@@ -1,15 +0,0 @@
using NpgsqlTypes;
namespace Pf2eModel.Model.Enum;
public enum AncestryVision
{
[PgName("normal")]
Normal,
[PgName("low-light-vision")]
LowLightVision,
[PgName("dark-vision")]
DarkVision,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление значений атрибутов.
/// </summary>
public enum AttributeValues public enum AttributeValues
{ {
/// <summary>
/// Свободный атрибут.
/// </summary>
[PgName("free")] [PgName("free")]
Free, Free,
/// <summary>
/// Сила.
/// </summary>
[PgName("str")] [PgName("str")]
Strength, Strength,
/// <summary>
/// Ловкость.
/// </summary>
[PgName("dex")] [PgName("dex")]
Dexterity, Dexterity,
/// <summary>
/// Телосложение.
/// </summary>
[PgName("con")] [PgName("con")]
Constitution, Constitution,
/// <summary>
/// Интеллект.
/// </summary>
[PgName("int")] [PgName("int")]
Intelligence, Intelligence,
/// <summary>
/// Мудрость.
/// </summary>
[PgName("wis")] [PgName("wis")]
Wisdom, Wisdom,
/// <summary>
/// Харизма.
/// </summary>
[PgName("cha")] [PgName("cha")]
Charisma, Charisma,
} }
@@ -2,23 +2,50 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип элемента прогрессии класса.
/// </summary>
public enum ClassProgressionType public enum ClassProgressionType
{ {
/// <summary>
/// Неизвестный тип прогрессии класса.
/// </summary>
[PgName("entity")] [PgName("entity")]
Entity, Entity,
/// <summary>
/// Навык архетипа.
/// </summary>
[PgName("ancestry_feat")] [PgName("ancestry_feat")]
AncestryFeat, AncestryFeat,
/// <summary>
/// Классовая особенность.
/// </summary>
[PgName("class_feat")] [PgName("class_feat")]
ClassFeat, ClassFeat,
/// <summary>
/// Общий навык.
/// </summary>
[PgName("general_feat")] [PgName("general_feat")]
GeneralFeat, GeneralFeat,
/// <summary>
/// Навык
/// </summary>
[PgName("skill_feat")] [PgName("skill_feat")]
SkillFeat, SkillFeat,
/// <summary>
/// Увеличение навыка.
/// </summary>
[PgName("skill_increase")] [PgName("skill_increase")]
SkillIncrease, SkillIncrease,
/// <summary>
/// Увеличение атрибута.
/// </summary>
[PgName("attribute_increase")]
AttributeIncrease,
} }
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип состояния
/// </summary>
public enum ConditionGroup public enum ConditionGroup
{ {
/// <summary>
/// Неизвестое состояние.
/// </summary>
[PgName("unknown")] [PgName("unknown")]
Unknown, Unknown,
/// <summary>
/// Чувство.
/// </summary>
[PgName("senses")] [PgName("senses")]
Senses, Senses,
/// <summary>
/// Способность.
/// </summary>
[PgName("abilities")] [PgName("abilities")]
Abilities, Abilities,
/// <summary>
/// Смерть.
/// </summary>
[PgName("death")] [PgName("death")]
Death, Death,
/// <summary>
/// Отношение. (???)
/// </summary>
[PgName("attitudes")] [PgName("attitudes")]
Attitudes, Attitudes,
/// <summary>
/// Обнаружение.
/// </summary>
[PgName("detection")] [PgName("detection")]
Detection, Detection,
} }
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип божества.
/// </summary>
public enum DeityCategory public enum DeityCategory
{ {
/// <summary>
/// Божество.
/// </summary>
[PgName("deity")] [PgName("deity")]
Deity, Deity,
/// <summary>
/// Пантеон.
/// </summary>
[PgName("pantheon")] [PgName("pantheon")]
Pantheon, Pantheon,
/// <summary>
/// Ковенант.
/// </summary>
[PgName("covenant")] [PgName("covenant")]
Covenant, Covenant,
/// <summary>
/// Философия.
/// </summary>
[PgName("philosophy")] [PgName("philosophy")]
Philosophy, Philosophy,
} }
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип божественной силы.
/// </summary>
public enum DeityFonts public enum DeityFonts
{ {
/// <summary>
/// Без божественной силы.
/// </summary>
[PgName("none")] [PgName("none")]
None, None,
/// <summary>
/// Исцеление.
/// </summary>
[PgName("heal")] [PgName("heal")]
Heal, Heal,
/// <summary>
/// Урон.
/// </summary>
[PgName("harm")] [PgName("harm")]
Harm, Harm,
/// <summary>
/// Любой тип божественной силы.
/// </summary>
[PgName("any")] [PgName("any")]
Any, Any,
} }
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип освящения божества.
/// </summary>
public enum DeitySanctification public enum DeitySanctification
{ {
/// <summary>
/// Святость.
/// </summary>
[PgName("holy")] [PgName("holy")]
Holy, Holy,
/// <summary>
/// Нечестивость.
/// </summary>
[PgName("unholy")] [PgName("unholy")]
Unholy, Unholy,
/// <summary>
/// Любое.
/// </summary>
[PgName("any")] [PgName("any")]
Any, Any,
} }
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление элементов.
/// </summary>
public enum ElementEnum public enum ElementEnum
{ {
/// <summary>
/// Универсальный элемент.
/// </summary>
[PgName("universal")] [PgName("universal")]
Universal, Universal,
/// <summary>
/// Воздух.
/// </summary>
[PgName("air")] [PgName("air")]
Air, Air,
/// <summary>
/// Вода.
/// </summary>
[PgName("water")] [PgName("water")]
Water, Water,
/// <summary>
/// Земля.
/// </summary>
[PgName("earth")] [PgName("earth")]
Earth, Earth,
/// <summary>
/// Огонь.
/// </summary>
[PgName("fire")] [PgName("fire")]
Fire, Fire,
/// <summary>
/// Дерево.
/// </summary>
[PgName("wood")] [PgName("wood")]
Wood, Wood,
/// <summary>
/// Металл.
/// </summary>
[PgName("metal")] [PgName("metal")]
Metal, Metal,
} }
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление редкости сущности.
/// </summary>
public enum EntityRarity public enum EntityRarity
{ {
/// <summary>
/// Обычная редкость.
/// </summary>
[PgName("common")] [PgName("common")]
Common, Common,
/// <summary>
/// Необычная редкость.
/// </summary>
[PgName("uncommon")] [PgName("uncommon")]
Uncommon, Uncommon,
/// <summary>
/// Редкая редкость.
/// </summary>
[PgName("rare")] [PgName("rare")]
Rare, Rare,
/// <summary>
/// Уникальная редкость.
/// </summary>
[PgName("unique")] [PgName("unique")]
Unique, Unique,
} }
+60
View File
@@ -2,62 +2,122 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип сущности.
/// </summary>
public enum EntityType public enum EntityType
{ {
/// <summary>
/// Неизвестный тип сущности.
/// </summary>
[PgName("unknown")] [PgName("unknown")]
Unknown, Unknown,
/// <summary>
/// Признак.
/// </summary>
[PgName("trait")] [PgName("trait")]
Trait, Trait,
/// <summary>
/// Действие.
/// </summary>
[PgName("action")] [PgName("action")]
Action, Action,
/// <summary>
/// Родословная.
/// </summary>
[PgName("ancestry")] [PgName("ancestry")]
Ancestry, Ancestry,
/// <summary>
/// Архетип.
/// </summary>
[PgName("archetype")] [PgName("archetype")]
Archetype, Archetype,
/// <summary>
/// Происхождение.
/// </summary>
[PgName("background")] [PgName("background")]
Background, Background,
/// <summary>
/// Рюкзак.
/// </summary>
[PgName("backpack")] [PgName("backpack")]
Backpack, Backpack,
/// <summary>
/// Способность кампании.
/// </summary>
[PgName("campaign_feature")] [PgName("campaign_feature")]
CampaignFeature, CampaignFeature,
/// <summary>
/// Класс.
/// </summary>
[PgName("class")] [PgName("class")]
Class, Class,
/// <summary>
/// Группа подклассов.
/// </summary>
[PgName("subclass_group")] [PgName("subclass_group")]
SubclassGroup, SubclassGroup,
/// <summary>
/// Подкласс.
/// </summary>
[PgName("subclass")] [PgName("subclass")]
Subclass, Subclass,
/// <summary>
/// Состояние.
/// </summary>
[PgName("condition")] [PgName("condition")]
Condition, Condition,
/// <summary>
/// Божество.
/// </summary>
[PgName("deity")] [PgName("deity")]
Deity, Deity,
/// <summary>
/// Навык.
/// </summary>
[PgName("feat")] [PgName("feat")]
Feat, Feat,
/// <summary>
/// Наследие.
/// </summary>
[PgName("heritage")] [PgName("heritage")]
Heritage, Heritage,
/// <summary>
/// Заклианиние.
/// </summary>
[PgName("spell")] [PgName("spell")]
Spell, Spell,
/// <summary>
/// Ритуал.
/// </summary>
[PgName("ritual")] [PgName("ritual")]
Ritual, Ritual,
/// <summary>
/// Язык.
/// </summary>
[PgName("language")] [PgName("language")]
Language, Language,
/// <summary>
/// Правило.
/// </summary>
[PgName("rule")] [PgName("rule")]
Rule, Rule,
} }
-18
View File
@@ -1,18 +0,0 @@
using NpgsqlTypes;
namespace Pf2eModel.Model.Enum;
public enum FeatActionType
{
[PgName("passive")]
Passive,
[PgName("action")]
Action,
[PgName("reaction")]
Reaction,
[PgName("free")]
Free,
}
+8 -5
View File
@@ -7,11 +7,14 @@ public enum FeatCategory
[PgName("uncategorized")] [PgName("uncategorized")]
Uncategorized, Uncategorized,
[PgName("ancestry")]
Ancestry,
[PgName("ancestry-feature")] [PgName("ancestry-feature")]
AncestryFeature, AncestryFeature,
[PgName("class-feature")] [PgName("archetype")]
ClassFeature, Archetype,
[PgName("calling")] [PgName("calling")]
Calling, Calling,
@@ -19,15 +22,15 @@ public enum FeatCategory
[PgName("class")] [PgName("class")]
Class, Class,
[PgName("class-feature")]
ClassFeature,
[PgName("skill")] [PgName("skill")]
Skill, Skill,
[PgName("general")] [PgName("general")]
General, General,
[PgName("ancestry")]
Ancestry,
[PgName("bonus")] [PgName("bonus")]
Bonus, Bonus,
-18
View File
@@ -1,18 +0,0 @@
using NpgsqlTypes;
namespace Pf2eModel.Model.Enum;
public enum Size
{
[PgName("tiny")]
Tiny,
[PgName("small")]
Small,
[PgName("medium")]
Medium,
[PgName("large")]
Large,
}
+39
View File
@@ -0,0 +1,39 @@
using NpgsqlTypes;
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Размер.
/// </summary>
public enum SizeEnum
{
/// <summary>
/// Крошечный размер.
/// </summary>
[PgName("tiny")]
Tiny,
/// <summary>
/// Маленький размер.
/// </summary>
[PgName("small")]
Small,
/// <summary>
/// Средний размер.
/// </summary>
[PgName("medium")]
Medium,
/// <summary>
/// Большой размер.
/// </summary>
[PgName("large")]
Large,
/// <summary>
/// Громадный размер.
/// </summary>
[PgName("huge")]
Huge,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление категорий источников.
/// </summary>
public enum SourceCategory public enum SourceCategory
{ {
/// <summary>
/// Неизвестная категория источника.
/// </summary>
[PgName("rulebook")] [PgName("rulebook")]
Rulebooks, Rulebooks,
/// <summary>
/// Серия приключений.
/// </summary>
[PgName("adventure-path")] [PgName("adventure-path")]
AdventurePaths, AdventurePaths,
/// <summary>
/// Lost Omens
/// </summary>
[PgName("lost-omens")] [PgName("lost-omens")]
LostOmens, LostOmens,
/// <summary>
/// Приключение.
/// </summary>
[PgName("adventures")] [PgName("adventures")]
Adventures, Adventures,
/// <summary>
/// Комиксы.
/// </summary>
[PgName("comics")] [PgName("comics")]
Comics, Comics,
/// <summary>
/// Блог-посты.
/// </summary>
[PgName("blog-posts")] [PgName("blog-posts")]
BlogPosts, BlogPosts,
/// <summary>
/// Сообщество.
/// </summary>
[PgName("society")] [PgName("society")]
Society, Society,
} }
+36
View File
@@ -2,38 +2,74 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип области заклинания.
/// </summary>
public enum SpellAreaType public enum SpellAreaType
{ {
/// <summary>
/// Взрыв.
/// </summary>
[PgName("burst")] [PgName("burst")]
Burst, Burst,
/// <summary>
/// Эманация.
/// </summary>
[PgName("emanation")] [PgName("emanation")]
Emanation, Emanation,
/// <summary>
/// Конус.
/// </summary>
[PgName("cone")] [PgName("cone")]
Cone, Cone,
/// <summary>
/// Линия.
/// </summary>
[PgName("line")] [PgName("line")]
Line, Line,
/// <summary>
/// Квадрат.
/// </summary>
[PgName("square")] [PgName("square")]
Square, Square,
/// <summary>
/// Куб.
/// </summary>
[PgName("cube")] [PgName("cube")]
Cube, Cube,
/// <summary>
/// Цилиндр.
/// </summary>
[PgName("cylinder")] [PgName("cylinder")]
Cylinder, Cylinder,
/// <summary>
/// Варьируемое.
/// </summary>
[PgName("varies")] [PgName("varies")]
Varies, Varies,
/// <summary>
/// Параллелипипед.
/// </summary>
[PgName("cuboid")] [PgName("cuboid")]
Cuboid, Cuboid,
/// <summary>
/// Круг.
/// </summary>
[PgName("circle")] [PgName("circle")]
Circle, Circle,
/// <summary>
/// Иное.
/// </summary>
[PgName("other")] [PgName("other")]
Other, Other,
} }
@@ -2,11 +2,26 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип урона заклинания.
/// </summary>
public enum SpellDamageCategory public enum SpellDamageCategory
{ {
/// <summary>
/// Обычный урон.
/// </summary>
[PgName("normal")]
Normal,
/// <summary>
/// Продолжительный урон.
/// </summary>
[PgName("persistent")] [PgName("persistent")]
Persistent, Persistent,
/// <summary>
/// Брызги.
/// </summary>
[PgName("splash")] [PgName("splash")]
Splash, Splash,
} }
+12
View File
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип урона заклинания.
/// </summary>
public enum SpellDamageKinds public enum SpellDamageKinds
{ {
/// <summary>
/// Урон.
/// </summary>
[PgName("damage")] [PgName("damage")]
Damage, Damage,
/// <summary>
/// Исцеление.
/// </summary>
[PgName("healing")] [PgName("healing")]
Healing, Healing,
/// <summary>
/// Любое.
/// </summary>
[PgName("any")] [PgName("any")]
Any, Any,
} }
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Традиция заклинания.
/// </summary>
public enum SpellTradition public enum SpellTradition
{ {
/// <summary>
/// Без традиции.
/// </summary>
[PgName("none")] [PgName("none")]
None, None,
/// <summary>
/// Сакральная традиция.
/// </summary>
[PgName("divine")] [PgName("divine")]
Divine, Divine,
/// <summary>
/// Оккультная традиция.
/// </summary>
[PgName("occult")] [PgName("occult")]
Occult, Occult,
/// <summary>
/// Арканная традиция.
/// </summary>
[PgName("arcane")] [PgName("arcane")]
Arcane, Arcane,
/// <summary>
/// Примальная традиция.
/// </summary>
[PgName("primal")] [PgName("primal")]
Primal, Primal,
/// <summary>
/// Элементная традиция.
/// </summary>
[PgName("elemental")] [PgName("elemental")]
Elemental, Elemental,
/// <summary>
/// Все традиции.
/// </summary>
[PgName("all")] [PgName("all")]
All, All,
} }
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Ранг тренировки.
/// </summary>
public enum TrainingRank public enum TrainingRank
{ {
/// <summary>
/// Необученный.
/// </summary>
[PgName("untrained")] [PgName("untrained")]
Untrained, Untrained,
/// <summary>
/// Обученный.
/// </summary>
[PgName("trained")] [PgName("trained")]
Trained, Trained,
/// <summary>
/// Эксперт.
/// </summary>
[PgName("expert")] [PgName("expert")]
Expert, Expert,
/// <summary>
/// Мастер.
/// </summary>
[PgName("master")] [PgName("master")]
Master, Master,
/// <summary>
/// Легендарный.
/// </summary>
[PgName("legendary")] [PgName("legendary")]
Legendary, Legendary,
/// <summary>
/// Мифический.
/// </summary>
[PgName("mythic")] [PgName("mythic")]
Mythic, Mythic,
} }
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип тренировки.
/// </summary>
public enum TrainingType public enum TrainingType
{ {
/// <summary>
/// Восприятие.
/// </summary>
[PgName("perception")] [PgName("perception")]
Perception, Perception,
/// <summary>
/// Навык.
/// </summary>
[PgName("skill")] [PgName("skill")]
Skill, Skill,
/// <summary>
/// Знание.
/// </summary>
[PgName("lore")] [PgName("lore")]
Lore, Lore,
/// <summary>
/// Оружие.
/// </summary>
[PgName("weapon")] [PgName("weapon")]
Weapon, Weapon,
/// <summary>
/// Защита.
/// </summary>
[PgName("armor")] [PgName("armor")]
Armor, Armor,
/// <summary>
/// Спасбросок.
/// </summary>
[PgName("save")] [PgName("save")]
Save, Save,
} }
+12
View File
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum; namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип признака.
/// </summary>
public enum TraitType public enum TraitType
{ {
/// <summary>
/// Обычный признак.
/// </summary>
[PgName("regular")] [PgName("regular")]
Regular, Regular,
/// <summary>
/// Признак класса.
/// </summary>
[PgName("class")] [PgName("class")]
Class, Class,
/// <summary>
/// Признак традиции.
/// </summary>
[PgName("tradition")] [PgName("tradition")]
Tradition, Tradition,
} }
+27
View File
@@ -0,0 +1,27 @@
using NpgsqlTypes;
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление типов зрения.
/// </summary>
public enum VisionEnum
{
/// <summary>
/// Обычное зрение.
/// </summary>
[PgName("normal")]
Normal,
/// <summary>
/// Зрение в темноте.
/// </summary>
[PgName("low-light-vision")]
LowLightVision,
/// <summary>
/// Тёмное зрение.
/// </summary>
[PgName("dark-vision")]
DarkVision,
}
+9
View File
@@ -3,10 +3,19 @@ using Pf2eModel.Model.Base;
namespace Pf2eModel.Model; namespace Pf2eModel.Model;
/// <summary>
/// Интерфейс сущностей структуры.
/// </summary>
public interface IEntity public interface IEntity
{ {
/// <summary>
/// Идентификатор сущности.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Корневая сущность.
/// </summary>
[JsonIgnore] [JsonIgnore]
public Entity Entity { get; set; } public Entity Entity { get; set; }
} }
+20 -5
View File
@@ -1,23 +1,38 @@
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Действие.
/// </summary>
[EntityOfType(EntityType.Action)] [EntityOfType(EntityType.Action)]
public class Action : IEntity public class Action : IEntity
{ {
[System.ComponentModel.DataAnnotations.Key] /// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Количество действий.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Количество действий")]
public ActionEnum Actions { get; set; } = ActionEnum.Unknown; public ActionEnum Actions { get; set; } = ActionEnum.Unknown;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength [Comment("Дополнительная информация")]
public string? Extra { get; set; } public string? Extra { get; set; }
public Entity Entity { get; set; } = null!;
} }
+40 -4
View File
@@ -1,37 +1,73 @@
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.AncestryRelation; using Pf2eModel.Model.Structure.AncestryRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Родословная.
/// </summary>
[EntityOfType(EntityType.Ancestry)] [EntityOfType(EntityType.Ancestry)]
public class Ancestry : IEntity public class Ancestry : IEntity
{ {
[System.ComponentModel.DataAnnotations.Key] /// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Размеры родословной.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
public Size[] Size { get; set; } = []; [Comment("Размеры родословной")]
public SizeEnum[] Size { get; set; } = [];
/// <summary>
/// Количество очков здоровья.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Количество очков здоровья")]
public int Hp { get; set; } public int Hp { get; set; }
/// <summary>
/// Скорость передвижения.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Скорость передвижения")]
public int Speed { get; set; } public int Speed { get; set; }
/// <summary>
/// Тип зрения.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
public AncestryVision Vision { get; set; } = AncestryVision.Normal; [Comment("Тип зрения")]
public VisionEnum VisionEnum { get; set; } = VisionEnum.Normal;
/// <summary>
/// Коллекция повышениий аттрибутов.
/// </summary>
public ICollection<AncestryBoost> AncestryBoosts { get; set; } = []; public ICollection<AncestryBoost> AncestryBoosts { get; set; } = [];
/// <summary>
/// Коллекция сущностей родословной.
/// </summary>
public ICollection<AncestryItem> AncestryItems { get; set; } = []; public ICollection<AncestryItem> AncestryItems { get; set; } = [];
/// <summary>
/// Коллекция языков родословной.
/// </summary>
public ICollection<AncestryLanguage> AncestryLanguages { get; set; } = []; public ICollection<AncestryLanguage> AncestryLanguages { get; set; } = [];
/// <summary>
/// Коллекция наследий.
/// </summary>
public ICollection<Heritage> Heritages { get; set; } = []; public ICollection<Heritage> Heritages { get; set; } = [];
} }
+26 -1
View File
@@ -1,30 +1,55 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Архетип.
/// </summary>
[EntityOfType(EntityType.Archetype)] [EntityOfType(EntityType.Archetype)]
public class Archetype : IEntity public class Archetype : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Уровень")]
public int Level { get; set; } public int Level { get; set; }
/// <summary>
/// Идентификатор способности, которая является посвящением в архетип.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("ID посвящения")]
public int? DedicationFeatId { get; set; } = null; public int? DedicationFeatId { get; set; } = null;
/// <summary>
/// Дополнительная информация об архетипе.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength [Comment("Дополнительная информация")]
public string? Extra { get; set; } public string? Extra { get; set; }
/// <summary>
/// Посвящение в архетип.
/// </summary>
public Feat DedicationFeat { get; set; } = null!; public Feat DedicationFeat { get; set; } = null!;
/// <summary>
/// Способности архетипа.
/// </summary>
public ICollection<Feat> Feats { get; set; } = []; public ICollection<Feat> Feats { get; set; } = [];
} }
+16
View File
@@ -1,24 +1,40 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.BackgroundRelation; using Pf2eModel.Model.Structure.BackgroundRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Предыстория.
/// </summary>
[EntityOfType(EntityType.Background)] [EntityOfType(EntityType.Background)]
public class Background : IEntity public class Background : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Аттрибуты предыстории.
/// </summary>
public ICollection<BackgroundBoost> BackgroundBoosts { get; set; } = []; public ICollection<BackgroundBoost> BackgroundBoosts { get; set; } = [];
/// <summary>
/// Способности предыстории.
/// </summary>
public ICollection<BackgroundItem> BackgroundItems { get; set; } = []; public ICollection<BackgroundItem> BackgroundItems { get; set; } = [];
/// <summary>
/// Навыки предыстории.
/// </summary>
public ICollection<BackgroundTraining> BackgroundSkills { get; set; } = []; public ICollection<BackgroundTraining> BackgroundSkills { get; set; } = [];
} }
+39 -6
View File
@@ -1,40 +1,73 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.ClassRelation; using Pf2eModel.Model.Structure.ClassRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Класс.
/// </summary>
[EntityOfType(EntityType.Class)] [EntityOfType(EntityType.Class)]
public class Class : IEntity public class Class : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
[Column(Order = 3)] /// <summary>
/// Количество очков здоровья.
/// </summary>
[Column(Order = 2)]
[Comment("Количество очков здоровья")]
public int Hp { get; set; } public int Hp { get; set; }
[Column(Order = 4)] /// <summary>
public int Perception { get; set; } /// Флаг, указывающий на то, что класс является заклинательным.
/// </summary>
[Column(Order = 5)] [Column(Order = 3)]
[Comment("Заклинатель?")]
public bool Spellcasting { get; set; } public bool Spellcasting { get; set; }
/// <summary>
/// Традиция заклинаний класса.
/// </summary>
[Column(Order = 6)] [Column(Order = 6)]
public SpellTradition Tradition { get; set; } [Comment("Традиция заклинаний")]
public SpellTradition? Tradition { get; set; } = null;
/// <summary>
/// Количество дополнительных навыков.
/// </summary>
[Column(Order = 7)] [Column(Order = 7)]
[Comment("Дополнительные навыки")]
public int AdditionalTrainedSkills { get; set; } public int AdditionalTrainedSkills { get; set; }
/// <summary>
/// Аттрибуты класса.
/// </summary>
public virtual ICollection<ClassKeyAbility> ClassKeyAbilities { get; set; } = []; public virtual ICollection<ClassKeyAbility> ClassKeyAbilities { get; set; } = [];
/// <summary>
/// Прогрессия класса.
/// </summary>
public virtual ICollection<ClassProgression> ClassProgressions { get; set; } = []; public virtual ICollection<ClassProgression> ClassProgressions { get; set; } = [];
/// <summary>
/// Навыки класса.
/// </summary>
public virtual ICollection<ClassTraining> ClassTrainings { get; set; } = []; public virtual ICollection<ClassTraining> ClassTrainings { get; set; } = [];
/// <summary>
/// Группы подклассов.
/// </summary>
public virtual ICollection<SubclassGroup> SubclassGroups { get; set; } = []; public virtual ICollection<SubclassGroup> SubclassGroups { get; set; } = [];
} }
+15 -1
View File
@@ -1,24 +1,38 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Состояние.
/// </summary>
[EntityOfType(EntityType.Condition)] [EntityOfType(EntityType.Condition)]
public class Condition : IEntity public class Condition : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Группа состояния.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Группа состояния")]
public ConditionGroup? Group { get; set; } public ConditionGroup? Group { get; set; }
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength [Comment("Дополнительная информация")]
public string? Extra { get; set; } public string? Extra { get; set; }
} }
+38
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common; using Pf2eModel.Model.Common;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
@@ -7,35 +8,72 @@ using Pf2eModel.Model.Structure.DeityRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Божество.
/// </summary>
[EntityOfType(EntityType.Deity)] [EntityOfType(EntityType.Deity)]
public class Deity : IEntity public class Deity : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Тип божества.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Тип божества")]
public DeityCategory Category { get; set; } public DeityCategory Category { get; set; }
/// <summary>
/// Тип божественный силы.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Тип божественной силы")]
public DeityFonts Fonts { get; set; } public DeityFonts Fonts { get; set; }
/// <summary>
/// Тип освящения.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Тип освящения")]
public DeitySanctification Sanctification { get; set; } public DeitySanctification Sanctification { get; set; }
/// <summary>
/// Обязательное освящение.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
[Comment("Обязательное освящение")]
public bool SanctificationMust { get; set; } public bool SanctificationMust { get; set; }
/// <summary>
/// Аттрибуты божества.
/// </summary>
public ICollection<DeityAttribute> DeityAttributes { get; set; } = new List<DeityAttribute>(); public ICollection<DeityAttribute> DeityAttributes { get; set; } = new List<DeityAttribute>();
/// <summary>
/// Домены божества.
/// </summary>
public ICollection<DeityDomain> DeityDomains { get; set; } = new List<DeityDomain>(); public ICollection<DeityDomain> DeityDomains { get; set; } = new List<DeityDomain>();
/// <summary>
/// Заклинания божества.
/// </summary>
public ICollection<DeitySpell> DeitySpells { get; set; } = new List<DeitySpell>(); public ICollection<DeitySpell> DeitySpells { get; set; } = new List<DeitySpell>();
/// <summary>
/// Оружия божества.
/// </summary>
public ICollection<DeityWeapon> DeityWeapons { get; set; } = new List<DeityWeapon>(); public ICollection<DeityWeapon> DeityWeapons { get; set; } = new List<DeityWeapon>();
/// <summary>
/// Навыки божества.
/// </summary>
public ICollection<Training> Skills { get; set; } = new List<Training>(); public ICollection<Training> Skills { get; set; } = new List<Training>();
} }
+27 -2
View File
@@ -1,28 +1,44 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.FeatRelation; using Pf2eModel.Model.Structure.FeatRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Способность.
/// </summary>
[EntityOfType(EntityType.Feat)] [EntityOfType(EntityType.Feat)]
public class Feat : IEntity public class Feat : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Категория способности.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
public ActionCategory Category { get; set; } [Comment("Категория способности")]
public FeatCategory Category { get; set; }
/// <summary>
/// Уровень способности.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Уровень способности")]
public int Level { get; set; } public int Level { get; set; }
[Column(Order = 5)] [Column(Order = 5)]
[Comment("Количество действий")]
public int? Actions { get; set; } = null; public int? Actions { get; set; } = null;
[Column(Order = 6)] [Column(Order = 6)]
@@ -37,11 +53,20 @@ public class Feat : IEntity
[Column(Order = 9)] [Column(Order = 9)]
public bool IsPassive { get; set; } = false; public bool IsPassive { get; set; } = false;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 10)] [Column(Order = 10)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength [Comment("Дополнительная информация")]
public string? Extra { get; set; } public string? Extra { get; set; }
/// <summary>
/// Архетипы, которые могут использовать эту способность.
/// </summary>
public ICollection<Archetype> Archetypes { get; set; } = []; public ICollection<Archetype> Archetypes { get; set; } = [];
/// <summary>
/// Требования к получению способности.
/// </summary>
public ICollection<FeatPrerequisite> FeatPrerequisites { get; set; } = []; public ICollection<FeatPrerequisite> FeatPrerequisites { get; set; } = [];
} }
+15 -1
View File
@@ -1,22 +1,36 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Наследие.
/// </summary>
[EntityOfType(EntityType.Heritage)] [EntityOfType(EntityType.Heritage)]
public class Heritage : IEntity public class Heritage : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Идентификатор родословной.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Идентификатор родословной")]
public int? AncestryId { get; set; } public int? AncestryId { get; set; }
public virtual Ancestry? Ancestry { get; set; } /// <summary>
/// Родословная.
/// </summary>
public Ancestry? Ancestry { get; set; }
} }
+8 -1
View File
@@ -1,17 +1,24 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Язык.
/// </summary>
[EntityOfType(EntityType.Language)] [EntityOfType(EntityType.Language)]
public class Language : IEntity public class Language : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
} }
+69 -2
View File
@@ -8,60 +8,127 @@ using Pf2eModel.Model.Structure.RitualRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Ритуал.
/// </summary>
[EntityOfType(EntityType.Ritual)] [EntityOfType(EntityType.Ritual)]
public class Ritual : IEntity public class Ritual : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень ритуала.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Уровень ритуала")]
public int Level { get; set; } public int Level { get; set; }
/// <summary>
/// Продолжительность ритуала в секундах.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Продолжительность ритуала в секундах")] [Comment("Продолжительность ритуала в секундах")]
public int CastTime { get; set; } public int CastTime { get; set; }
/// <summary>
/// Время действия эффекта ритуала в секундах.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Время действия эффекта ритуала в секундах")] [Comment("Время действия эффекта ритуала в секундах")]
public int Duration { get; set; } public int Duration { get; set; }
/// <summary>
/// Элементы ритуала.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
[Comment("Элементы ритуала")]
public ElementEnum[] Elements { get; set; } = []; public ElementEnum[] Elements { get; set; } = [];
/// <summary>
/// Дальнность ритуала в футах.
/// </summary>
[Column(Order = 6)] [Column(Order = 6)]
[Comment("Дальнность ритуала")]
public int Range { get; set; } public int Range { get; set; }
/// <summary>
/// Ранг основной проверки.
/// </summary>
[Column(Order = 7)] [Column(Order = 7)]
[Comment("Ранг основной проверки")]
public TrainingRank PrimaryCheckRank { get; set; } = TrainingRank.Trained; public TrainingRank PrimaryCheckRank { get; set; } = TrainingRank.Trained;
/// <summary>
/// Дополнительная информация об основной проверки.
/// </summary>
[Column(Order = 8)] [Column(Order = 8)]
[Comment("Дополнительная информация об основной проверки")]
public LocaleString? PrimaryCheckSuffix { get; set; } = null; public LocaleString? PrimaryCheckSuffix { get; set; } = null;
/// <summary>
/// Количество дополнительных заклинателей, необходимых для ритуала.
/// </summary>
[Column(Order = 9)] [Column(Order = 9)]
[Comment("Количество дополнительных заклинателей")]
public int SecondaryCasters { get; set; } = 0; public int SecondaryCasters { get; set; } = 0;
/// <summary>
/// Максимальное количество дополнительных заклинателей, необходимых для ритуала.
/// </summary>
[Column(Order = 10)] [Column(Order = 10)]
[Comment("Максимальное количество дополнительных заклинателей")]
public int SecondaryCastersMax { get; set; } = 0; public int SecondaryCastersMax { get; set; } = 0;
/// <summary>
/// Дополнительная информация о дополнительных заклинателях.
/// </summary>
[Column(Order = 11)] [Column(Order = 11)]
[Comment("Дополнительная информация о дополнительных заклинателях")]
public LocaleString? SecondaryCastersSuffix { get; set; } = null; public LocaleString? SecondaryCastersSuffix { get; set; } = null;
/// <summary>
/// Строка, описывающая дальность ритуала.
/// </summary>
[Column(Order = 12)] [Column(Order = 12)]
[Comment("Дальность ритуала")]
public LocaleString? RangeString { get; set; } = null; public LocaleString? RangeString { get; set; } = null;
/// <summary>
/// Строка, описывающая цель ритуала.
/// </summary>
[Column(Order = 13)] [Column(Order = 13)]
[Comment("Цель ритуала")]
public LocaleString? Target { get; set; } = null; public LocaleString? Target { get; set; } = null;
/// <summary>
/// Строка, описывающая стоимость ритуала.
/// </summary>
[Column(Order = 14)] [Column(Order = 14)]
[Comment("Стоимость ритуала")]
public LocaleString? Cost { get; set; } = null; public LocaleString? Cost { get; set; } = null;
/// <summary>
/// Строка, описывающая требования к ритуалу.
/// </summary>
[Column(Order = 15)] [Column(Order = 15)]
[Comment("Требования к ритуалу")]
public LocaleString? Requirement { get; set; } = null; public LocaleString? Requirement { get; set; } = null;
public virtual RitualArea? Area { get; set; } = null; /// <summary>
/// Коллекция областей ритуала.
/// </summary>
public RitualArea? Area { get; set; } = null;
public virtual ICollection<RitualCheck> Checks { get; set; } = []; /// <summary>
/// Коллекция проверок ритуала.
/// </summary>
public ICollection<RitualCheck> Checks { get; set; } = [];
} }
+24
View File
@@ -1,29 +1,53 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Правило.
/// </summary>
[EntityOfType(EntityType.Rule)] [EntityOfType(EntityType.Rule)]
public class Rule : IEntity public class Rule : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Порядок отображения.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Порядок отображения")]
public int Order { get; set; } public int Order { get; set; }
/// <summary>
/// Идентификатор родительского правила.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Родительского правило")]
public int? ParentId { get; set; } = null; public int? ParentId { get; set; } = null;
/// <summary>
/// Родительское правило.
/// </summary>
public Rule? Parent { get; set; } = null; public Rule? Parent { get; set; } = null;
/// <summary>
/// Дочерние правила.
/// </summary>
public ICollection<Rule> Children { get; set; } = []; public ICollection<Rule> Children { get; set; } = [];
/// <summary>
/// Хлебные крошки для отображения в интерфейсе.
/// </summary>
public string[] Breadcrumbs { get; set; } = []; public string[] Breadcrumbs { get; set; } = [];
} }
+58 -2
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common.I18n; using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
@@ -7,48 +8,97 @@ using Pf2eModel.Model.Structure.SpellRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Заклинание.
/// </summary>
[EntityOfType(EntityType.Spell)] [EntityOfType(EntityType.Spell)]
public class Spell : IEntity public class Spell : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень заклинания.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
public int Level { get; set; } public int Level { get; set; }
/// <summary>
/// Является ли заклинание фокусом.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Фокус?")]
public bool IsFocus { get; set; } public bool IsFocus { get; set; }
/// <summary>
/// Количество действий, необходимых для применения заклинания.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
[Comment("Количество действий")]
public ActionEnum Actions { get; set; } = ActionEnum.Other; public ActionEnum Actions { get; set; } = ActionEnum.Other;
/// <summary>
/// Время длительности заклинания в секундах.
/// </summary>
[Column(Order = 5)] [Column(Order = 5)]
[MaxLength(255)] [MaxLength(255)]
[Comment("Время длительности заклинания")]
public int? Duration { get; set; } = null; public int? Duration { get; set; } = null;
/// <summary>
/// Дальность заклинания в футах.
/// </summary>
[Column(Order = 6)] [Column(Order = 6)]
[Comment("Дальность заклинания")]
public int Range { get; set; } public int Range { get; set; }
/// <summary>
/// Традиции заклинания.
/// </summary>
[Column(Order = 7)] [Column(Order = 7)]
[Comment("Традиции заклинания")]
public SpellTradition[] Traditions { get; set; } = []; public SpellTradition[] Traditions { get; set; } = [];
/// <summary>
/// Элементы заклинания.
/// </summary>
[Column(Order = 8)] [Column(Order = 8)]
[Comment("Элементы заклинания")]
public ElementEnum[] Elements { get; set; } = []; public ElementEnum[] Elements { get; set; } = [];
/// <summary>
/// Триггер заклинания.
/// </summary>
[Column(Order = 9)] [Column(Order = 9)]
[Comment("Триггер заклинания")]
public LocaleString? Trigger { get; set; } = null; public LocaleString? Trigger { get; set; } = null;
/// <summary>
/// Цель заклинания.
/// </summary>
[Column(Order = 10)] [Column(Order = 10)]
[Comment("Цель заклинания")]
public LocaleString? Target { get; set; } = null; public LocaleString? Target { get; set; } = null;
/// <summary>
/// Стоимость заклинания.
/// </summary>
[Column(Order = 11)] [Column(Order = 11)]
[Comment("Стоимость заклинания")]
public LocaleString? Cost { get; set; } = null; public LocaleString? Cost { get; set; } = null;
/// <summary>
/// Требования к заклинанию.
/// </summary>
[Column(Order = 12)] [Column(Order = 12)]
[Comment("Требования к заклинанию")]
public LocaleString? Requirement { get; set; } = null; public LocaleString? Requirement { get; set; } = null;
/* /*
@@ -78,7 +128,13 @@ public class Spell : IEntity
public bool CanHeightening { get; set; } public bool CanHeightening { get; set; }
*/ */
public virtual ICollection<SpellArea> SpellAreas { get; set; } = []; /// <summary>
/// Коллекция области заклинания.
/// </summary>
public ICollection<SpellArea> SpellAreas { get; set; } = [];
public virtual ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>(); /// <summary>
/// Коллекция защиты от заклинания.
/// </summary>
public ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>();
} }
+24 -3
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common.I18n; using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
@@ -7,28 +8,48 @@ using Pf2eModel.Model.Structure.ClassRelation;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Подкласс.
/// </summary>
[EntityOfType(EntityType.Subclass)] [EntityOfType(EntityType.Subclass)]
public class Subclass : IEntity public class Subclass : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Идетификатор группы подклассов.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Группа подклассов")]
public int GroupId { get; set; } public int GroupId { get; set; }
/// <summary>
/// Группа подклассов.
/// </summary>
public SubclassGroup Group { get; set; } = null!; public SubclassGroup Group { get; set; } = null!;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)] [Column(Order = 3)]
[Comment("Дополнительная информация")]
public LocaleString Additional { get; set; } = []; public LocaleString Additional { get; set; } = [];
/// <summary>
/// Дополнительная информация в формате JSON.
/// </summary>
[Column(Order = 4)] [Column(Order = 4)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
public string Extra { get; set; } = "{}"; public string Extra { get; set; } = "{}";
public virtual ICollection<Entity> Entities { get; set; } = []; public ICollection<Entity> Entities { get; set; } = [];
public virtual ICollection<SubclassTrainings> Trainings { get; set; } = []; public ICollection<SubclassTrainings> Trainings { get; set; } = [];
} }
@@ -1,23 +1,41 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Группа подклассов.
/// </summary>
[EntityOfType(EntityType.SubclassGroup)] [EntityOfType(EntityType.SubclassGroup)]
public class SubclassGroup : IEntity public class SubclassGroup : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Идентификатор класса.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Идентификатор класса")]
public int? ClassId { get; set; } = null; public int? ClassId { get; set; } = null;
/// <summary>
/// Класс, к которому относится группа подклассов.
/// </summary>
public Class? Class { get; set; } = null!; public Class? Class { get; set; } = null!;
/// <summary>
/// Коллекция подклассов, относящихся к этой группе.
/// </summary>
public ICollection<Subclass> Subclasses { get; set; } = []; public ICollection<Subclass> Subclasses { get; set; } = [];
} }
+15 -2
View File
@@ -1,23 +1,36 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
/// <summary>
/// Признак.
/// </summary>
[EntityOfType(EntityType.Trait)] [EntityOfType(EntityType.Trait)]
public class Trait : IEntity public class Trait : IEntity
{ {
/// <inheritdoc/>
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)] [Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; } public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!; public Entity Entity { get; set; } = null!;
/// <summary>
/// Тип признака.
/// </summary>
[Column(Order = 2)] [Column(Order = 2)]
[Comment("Тип признака")]
public TraitType Type { get; set; } public TraitType Type { get; set; }
[Newtonsoft.Json.JsonIgnore] /// <summary>
public virtual ICollection<Entity> Entities { get; set; } = []; /// Сущности, которые имеют данный признак.
/// </summary>
public ICollection<Entity> Entities { get; set; } = [];
} }
+13 -9
View File
@@ -19,6 +19,9 @@ using Pf2eModel.Model.Structure.SpellRelation;
namespace Pf2eModel; namespace Pf2eModel;
/// <summary>
/// Контекст базы данных.
/// </summary>
public partial class Pf2eDbContext : DbContext public partial class Pf2eDbContext : DbContext
{ {
public Pf2eDbContext() { } public Pf2eDbContext() { }
@@ -118,6 +121,7 @@ public partial class Pf2eDbContext : DbContext
#endregion #endregion
/// <inheritdoc/>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ {
DotEnv.Load(options: new DotEnvOptions(probeForEnv: true, probeLevelsToSearch: 2)); DotEnv.Load(options: new DotEnvOptions(probeForEnv: true, probeLevelsToSearch: 2));
@@ -131,28 +135,28 @@ public partial class Pf2eDbContext : DbContext
builder => builder =>
{ {
builder builder
.MapEnum<ActionEnum>()
.MapEnum<EntityType>()
.MapEnum<EntityRarity>()
.MapEnum<LocaleType>() .MapEnum<LocaleType>()
.MapEnum<TraitType>()
.MapEnum<ActionCategory>() .MapEnum<ActionCategory>()
.MapEnum<Size>() .MapEnum<ActionEnum>()
.MapEnum<AncestryVision>() .MapEnum<AttributeValues>()
.MapEnum<ClassProgressionType>() .MapEnum<ClassProgressionType>()
.MapEnum<ConditionGroup>() .MapEnum<ConditionGroup>()
.MapEnum<DeityCategory>() .MapEnum<DeityCategory>()
.MapEnum<DeityFonts>() .MapEnum<DeityFonts>()
.MapEnum<DeitySanctification>() .MapEnum<DeitySanctification>()
.MapEnum<FeatActionType>() .MapEnum<ElementEnum>()
.MapEnum<EntityRarity>()
.MapEnum<EntityType>()
.MapEnum<FeatCategory>() .MapEnum<FeatCategory>()
.MapEnum<SizeEnum>()
.MapEnum<SourceCategory>()
.MapEnum<SpellAreaType>() .MapEnum<SpellAreaType>()
.MapEnum<SpellDamageCategory>() .MapEnum<SpellDamageCategory>()
.MapEnum<SpellDamageKinds>() .MapEnum<SpellDamageKinds>()
.MapEnum<SpellTradition>() .MapEnum<SpellTradition>()
.MapEnum<AttributeValues>()
.MapEnum<TrainingRank>() .MapEnum<TrainingRank>()
.MapEnum<SourceCategory>(); .MapEnum<TraitType>()
.MapEnum<VisionEnum>();
} }
); );
} }
+48 -11
View File
@@ -23,28 +23,45 @@ using Pf2eModel.Model.Structure.SpellRelation;
namespace Pf2eModel; namespace Pf2eModel;
[SuppressMessage("ReSharper", "UnusedParameter.Local")] /// <inheritdoc/>
[SuppressMessage("ReSharper", "InconsistentNaming")]
public partial class Pf2eDbContext public partial class Pf2eDbContext
{ {
/// <summary>
/// Длина названия сущности.
/// </summary>
public const int NameLength = 255; public const int NameLength = 255;
/// <inheritdoc/>
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.UseIdentityByDefaultColumns(); modelBuilder.UseIdentityByDefaultColumns();
DefineEnums(modelBuilder); // DefineEnums(modelBuilder);
DefineBase(modelBuilder); DefineBase(modelBuilder);
DefineCommon(modelBuilder); DefineCommon(modelBuilder);
DefineStructure(modelBuilder); DefineStructure(modelBuilder);
DefineMethods(modelBuilder); DefineMethods(modelBuilder);
} }
/// <summary>
/// Устанавливает связь между сущностью и её корневой сущностью.
/// </summary>
/// <typeparam name="T">Тип сущности.</typeparam>
/// <param name="entity">Генератор настроек таблицы сущности.</param>
private void BindEntity<T>(EntityTypeBuilder<T> entity) private void BindEntity<T>(EntityTypeBuilder<T> entity)
where T : class, IEntity where T : class, IEntity
{ {
entity.HasOne(e => e.Entity).WithOne().HasForeignKey<T>(e => e.Id).IsRequired(); entity.HasOne(e => e.Entity).WithOne().HasForeignKey<T>(e => e.Id).IsRequired();
} }
/// <summary>
/// Устанавливает связь между сущностью и локализованной строкой.
/// </summary>
/// <typeparam name="T">Тип сущности.</typeparam>
/// <param name="entity">Генератор настроек таблицы сущности.</param>
/// <param name="func">Функция, выбирающая поле сущности.</param>
/// <param name="required">Флаг, указывающий, что локализованная строка не может быть `null`.</param>
private void BindLocaleString<T>( private void BindLocaleString<T>(
EntityTypeBuilder<T> entity, EntityTypeBuilder<T> entity,
Expression<Func<T, LocaleString?>> func, Expression<Func<T, LocaleString?>> func,
@@ -59,33 +76,41 @@ public partial class Pf2eDbContext
.IsRequired(required); .IsRequired(required);
} }
/// <summary>
/// Определяет перечисления, используемые в модели.
/// </summary>
/// <param name="modelBuilder">Построитель модели.</param>
private void DefineEnums(ModelBuilder modelBuilder) private void DefineEnums(ModelBuilder modelBuilder)
{ {
modelBuilder modelBuilder
.HasPostgresEnum<ActionEnum>()
.HasPostgresEnum<EntityType>()
.HasPostgresEnum<EntityRarity>()
.HasPostgresEnum<LocaleType>() .HasPostgresEnum<LocaleType>()
.HasPostgresEnum<TraitType>()
.HasPostgresEnum<ActionCategory>() .HasPostgresEnum<ActionCategory>()
.HasPostgresEnum<Size>() .HasPostgresEnum<ActionEnum>()
.HasPostgresEnum<AncestryVision>() .HasPostgresEnum<AttributeValues>()
.HasPostgresEnum<ClassProgressionType>() .HasPostgresEnum<ClassProgressionType>()
.HasPostgresEnum<ConditionGroup>() .HasPostgresEnum<ConditionGroup>()
.HasPostgresEnum<DeityCategory>() .HasPostgresEnum<DeityCategory>()
.HasPostgresEnum<DeityFonts>() .HasPostgresEnum<DeityFonts>()
.HasPostgresEnum<DeitySanctification>() .HasPostgresEnum<DeitySanctification>()
.HasPostgresEnum<FeatActionType>() .HasPostgresEnum<ElementEnum>()
.HasPostgresEnum<EntityRarity>()
.HasPostgresEnum<EntityType>()
.HasPostgresEnum<FeatCategory>() .HasPostgresEnum<FeatCategory>()
.HasPostgresEnum<SizeEnum>()
.HasPostgresEnum<SourceCategory>()
.HasPostgresEnum<SpellAreaType>() .HasPostgresEnum<SpellAreaType>()
.HasPostgresEnum<SpellDamageCategory>() .HasPostgresEnum<SpellDamageCategory>()
.HasPostgresEnum<SpellDamageKinds>() .HasPostgresEnum<SpellDamageKinds>()
.HasPostgresEnum<SpellTradition>() .HasPostgresEnum<SpellTradition>()
.HasPostgresEnum<AttributeValues>()
.HasPostgresEnum<TrainingRank>() .HasPostgresEnum<TrainingRank>()
.HasPostgresEnum<SourceCategory>(); .HasPostgresEnum<TraitType>()
.HasPostgresEnum<VisionEnum>();
} }
/// <summary>
/// Определяет базовые сущности и их связи.
/// </summary>
/// <param name="modelBuilder">Построитель модели.</param>
private void DefineBase(ModelBuilder modelBuilder) private void DefineBase(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<Entity>(entity => modelBuilder.Entity<Entity>(entity =>
@@ -151,6 +176,10 @@ public partial class Pf2eDbContext
modelBuilder.Entity<KeywordAlias>(entity => { }); modelBuilder.Entity<KeywordAlias>(entity => { });
} }
/// <summary>
/// Определяет общие сущности и их связи.
/// </summary>
/// <param name="modelBuilder">Построитель модели.</param>
private void DefineCommon(ModelBuilder modelBuilder) private void DefineCommon(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<Frequency>(entity => { }); modelBuilder.Entity<Frequency>(entity => { });
@@ -163,6 +192,10 @@ public partial class Pf2eDbContext
}); });
} }
/// <summary>
/// Определяет структуру сущностей и их связи.
/// </summary>
/// <param name="modelBuilder">Построитель модели.</param>
private void DefineStructure(ModelBuilder modelBuilder) private void DefineStructure(ModelBuilder modelBuilder)
{ {
// Action // Action
@@ -517,6 +550,10 @@ public partial class Pf2eDbContext
}); });
} }
/// <summary>
/// Определяет методы, которые будут использоваться в запросах LINQ.
/// </summary>
/// <param name="modelBuilder">Построитель модели.</param>
private void DefineMethods(ModelBuilder modelBuilder) private void DefineMethods(ModelBuilder modelBuilder)
{ {
MethodInfo localeSearch = typeof(Pf2eDbContext).GetMethod( MethodInfo localeSearch = typeof(Pf2eDbContext).GetMethod(