diff --git a/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.Designer.cs b/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.Designer.cs
new file mode 100644
index 0000000..650ad6b
--- /dev/null
+++ b/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.Designer.cs
@@ -0,0 +1,182 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using WyvernInventory.Infrastructure.Data;
+
+#nullable disable
+
+namespace WyvernInventory.Infrastructure.Migrations
+{
+ [DbContext(typeof(DBContext))]
+ [Migration("20260501023055_InitialCreate")]
+ partial class InitialCreate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.7")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("DataType")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TypeId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TypeId");
+
+ b.ToTable("InventoryAttributeDefinitions");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AttributeDefinitionId")
+ .HasColumnType("int");
+
+ b.Property("BoolValue")
+ .HasColumnType("bit");
+
+ b.Property("DateTimeValue")
+ .HasColumnType("datetime2");
+
+ b.Property("DecimalValue")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("IntValue")
+ .HasColumnType("int");
+
+ b.Property("ItemId")
+ .HasColumnType("int");
+
+ b.Property("StringValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AttributeDefinitionId");
+
+ b.HasIndex("ItemId", "AttributeDefinitionId")
+ .IsUnique();
+
+ b.ToTable("InventoryAttributeValues");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TypeId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TypeId");
+
+ b.ToTable("InventoryItems");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("InventoryTypes");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeDefinition", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryType", "Type")
+ .WithMany("AttributeDefinitions")
+ .HasForeignKey("TypeId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Type");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeValue", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryAttributeDefinition", "AttributeDefinition")
+ .WithMany()
+ .HasForeignKey("AttributeDefinitionId")
+ .OnDelete(DeleteBehavior.NoAction)
+ .IsRequired();
+
+ b.HasOne("WyvernInventory.Core.Models.InventoryItem", "Item")
+ .WithMany("AttributeValues")
+ .HasForeignKey("ItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("AttributeDefinition");
+
+ b.Navigation("Item");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryType", "Type")
+ .WithMany()
+ .HasForeignKey("TypeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Type");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.Navigation("AttributeValues");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryType", b =>
+ {
+ b.Navigation("AttributeDefinitions");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.cs b/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.cs
new file mode 100644
index 0000000..3cc990f
--- /dev/null
+++ b/WyvernInventory.Infrastructure/Migrations/20260501023055_InitialCreate.cs
@@ -0,0 +1,136 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace WyvernInventory.Infrastructure.Migrations
+{
+ ///
+ public partial class InitialCreate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "InventoryTypes",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ Name = table.Column(type: "nvarchar(max)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_InventoryTypes", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "InventoryAttributeDefinitions",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ TypeId = table.Column(type: "int", nullable: true),
+ Name = table.Column(type: "nvarchar(max)", nullable: true),
+ DataType = table.Column(type: "int", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_InventoryAttributeDefinitions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_InventoryAttributeDefinitions_InventoryTypes_TypeId",
+ column: x => x.TypeId,
+ principalTable: "InventoryTypes",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "InventoryItems",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ Name = table.Column(type: "nvarchar(max)", nullable: false),
+ TypeId = table.Column(type: "int", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_InventoryItems", x => x.Id);
+ table.ForeignKey(
+ name: "FK_InventoryItems_InventoryTypes_TypeId",
+ column: x => x.TypeId,
+ principalTable: "InventoryTypes",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "InventoryAttributeValues",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ ItemId = table.Column(type: "int", nullable: false),
+ AttributeDefinitionId = table.Column(type: "int", nullable: false),
+ StringValue = table.Column(type: "nvarchar(max)", nullable: true),
+ IntValue = table.Column(type: "int", nullable: true),
+ DecimalValue = table.Column(type: "decimal(18,2)", nullable: true),
+ BoolValue = table.Column(type: "bit", nullable: true),
+ DateTimeValue = table.Column(type: "datetime2", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_InventoryAttributeValues", x => x.Id);
+ table.ForeignKey(
+ name: "FK_InventoryAttributeValues_InventoryAttributeDefinitions_AttributeDefinitionId",
+ column: x => x.AttributeDefinitionId,
+ principalTable: "InventoryAttributeDefinitions",
+ principalColumn: "Id");
+ table.ForeignKey(
+ name: "FK_InventoryAttributeValues_InventoryItems_ItemId",
+ column: x => x.ItemId,
+ principalTable: "InventoryItems",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InventoryAttributeDefinitions_TypeId",
+ table: "InventoryAttributeDefinitions",
+ column: "TypeId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InventoryAttributeValues_AttributeDefinitionId",
+ table: "InventoryAttributeValues",
+ column: "AttributeDefinitionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InventoryAttributeValues_ItemId_AttributeDefinitionId",
+ table: "InventoryAttributeValues",
+ columns: new[] { "ItemId", "AttributeDefinitionId" },
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InventoryItems_TypeId",
+ table: "InventoryItems",
+ column: "TypeId");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "InventoryAttributeValues");
+
+ migrationBuilder.DropTable(
+ name: "InventoryAttributeDefinitions");
+
+ migrationBuilder.DropTable(
+ name: "InventoryItems");
+
+ migrationBuilder.DropTable(
+ name: "InventoryTypes");
+ }
+ }
+}
diff --git a/WyvernInventory.Infrastructure/Migrations/DBContextModelSnapshot.cs b/WyvernInventory.Infrastructure/Migrations/DBContextModelSnapshot.cs
new file mode 100644
index 0000000..71f3310
--- /dev/null
+++ b/WyvernInventory.Infrastructure/Migrations/DBContextModelSnapshot.cs
@@ -0,0 +1,179 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using WyvernInventory.Infrastructure.Data;
+
+#nullable disable
+
+namespace WyvernInventory.Infrastructure.Migrations
+{
+ [DbContext(typeof(DBContext))]
+ partial class DBContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.7")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("DataType")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TypeId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TypeId");
+
+ b.ToTable("InventoryAttributeDefinitions");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AttributeDefinitionId")
+ .HasColumnType("int");
+
+ b.Property("BoolValue")
+ .HasColumnType("bit");
+
+ b.Property("DateTimeValue")
+ .HasColumnType("datetime2");
+
+ b.Property("DecimalValue")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("IntValue")
+ .HasColumnType("int");
+
+ b.Property("ItemId")
+ .HasColumnType("int");
+
+ b.Property("StringValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AttributeDefinitionId");
+
+ b.HasIndex("ItemId", "AttributeDefinitionId")
+ .IsUnique();
+
+ b.ToTable("InventoryAttributeValues");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TypeId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TypeId");
+
+ b.ToTable("InventoryItems");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("InventoryTypes");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeDefinition", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryType", "Type")
+ .WithMany("AttributeDefinitions")
+ .HasForeignKey("TypeId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Type");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryAttributeValue", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryAttributeDefinition", "AttributeDefinition")
+ .WithMany()
+ .HasForeignKey("AttributeDefinitionId")
+ .OnDelete(DeleteBehavior.NoAction)
+ .IsRequired();
+
+ b.HasOne("WyvernInventory.Core.Models.InventoryItem", "Item")
+ .WithMany("AttributeValues")
+ .HasForeignKey("ItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("AttributeDefinition");
+
+ b.Navigation("Item");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.HasOne("WyvernInventory.Core.Models.InventoryType", "Type")
+ .WithMany()
+ .HasForeignKey("TypeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Type");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryItem", b =>
+ {
+ b.Navigation("AttributeValues");
+ });
+
+ modelBuilder.Entity("WyvernInventory.Core.Models.InventoryType", b =>
+ {
+ b.Navigation("AttributeDefinitions");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}