diff --git a/osu.Game/Beatmaps/BeatmapMetadata.cs b/osu.Game/Beatmaps/BeatmapMetadata.cs
index 698d37a16c..684f31a4eb 100644
--- a/osu.Game/Beatmaps/BeatmapMetadata.cs
+++ b/osu.Game/Beatmaps/BeatmapMetadata.cs
@@ -14,6 +14,7 @@ namespace osu.Game.Beatmaps
[NotMapped]
public int? BeatmapSetOnlineInfoId { get; set; }
+ public int BeatmapSetInfoId { get; set; }
public string Title { get; set; }
public string TitleUnicode { get; set; }
diff --git a/osu.Game/Migrations/20171009205048_Init.Designer.cs b/osu.Game/Migrations/20171009205048_Init.Designer.cs
new file mode 100644
index 0000000000..251a13cbac
--- /dev/null
+++ b/osu.Game/Migrations/20171009205048_Init.Designer.cs
@@ -0,0 +1,292 @@
+//
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage;
+using osu.Game.Database;
+using System;
+
+namespace osu.Game.Migrations
+{
+ [DbContext(typeof(OsuDbContext))]
+ [Migration("20171009205048_Init")]
+ partial class Init
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.0.0-rtm-26452");
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapDifficulty", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ApproachRate");
+
+ b.Property("CircleSize");
+
+ b.Property("DrainRate");
+
+ b.Property("OverallDifficulty");
+
+ b.Property("SliderMultiplier");
+
+ b.Property("SliderTickRate");
+
+ b.HasKey("Id");
+
+ b.ToTable("BeatmapDifficulty");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AudioLeadIn");
+
+ b.Property("BeatDivisor");
+
+ b.Property("BeatmapDifficultyId");
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("Countdown");
+
+ b.Property("DistanceSpacing");
+
+ b.Property("GridSize");
+
+ b.Property("Hash");
+
+ b.Property("Hidden");
+
+ b.Property("LetterboxInBreaks");
+
+ b.Property("MD5Hash");
+
+ b.Property("MetadataId");
+
+ b.Property("Path");
+
+ b.Property("RulesetInfoId");
+
+ b.Property("SpecialStyle");
+
+ b.Property("StackLeniency");
+
+ b.Property("StarDifficulty");
+
+ b.Property("StoredBookmarks");
+
+ b.Property("TimelineZoom");
+
+ b.Property("Version");
+
+ b.Property("WidescreenStoryboard");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapDifficultyId");
+
+ b.HasIndex("BeatmapSetInfoId");
+
+ b.HasIndex("MD5Hash");
+
+ b.HasIndex("MetadataId");
+
+ b.HasIndex("RulesetInfoId");
+
+ b.ToTable("BeatmapInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Artist");
+
+ b.Property("ArtistUnicode");
+
+ b.Property("AudioFile");
+
+ b.Property("Author");
+
+ b.Property("BackgroundFile");
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("PreviewTime");
+
+ b.Property("Source");
+
+ b.Property("Tags");
+
+ b.Property("Title");
+
+ b.Property("TitleUnicode");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapSetInfoId")
+ .IsUnique();
+
+ b.ToTable("BeatmapMetadata");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("FileInfoId");
+
+ b.Property("Filename")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapSetInfoId");
+
+ b.HasIndex("FileInfoId");
+
+ b.ToTable("BeatmapSetFileInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("DeletePending");
+
+ b.Property("Hash");
+
+ b.Property("Protected");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DeletePending");
+
+ b.ToTable("BeatmapSetInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Input.Bindings.DatabasedKeyBinding", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("IntAction")
+ .HasColumnName("Action");
+
+ b.Property("KeysString")
+ .HasColumnName("Keys");
+
+ b.Property("RulesetInfoId");
+
+ b.Property("Variant");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IntAction");
+
+ b.HasIndex("Variant");
+
+ b.ToTable("KeyBinding");
+ });
+
+ modelBuilder.Entity("osu.Game.IO.FileInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Hash");
+
+ b.Property("ReferenceCount");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Hash")
+ .IsUnique();
+
+ b.HasIndex("ReferenceCount");
+
+ b.ToTable("FileInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Rulesets.RulesetInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Available");
+
+ b.Property("InstantiationInfo");
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Available");
+
+ b.HasIndex("InstantiationInfo")
+ .IsUnique();
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("RulesetInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapDifficulty", "Difficulty")
+ .WithMany()
+ .HasForeignKey("BeatmapDifficultyId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo", "BeatmapSet")
+ .WithMany("Beatmaps")
+ .HasForeignKey("BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.Beatmaps.BeatmapMetadata", "Metadata")
+ .WithMany()
+ .HasForeignKey("MetadataId");
+
+ b.HasOne("osu.Game.Rulesets.RulesetInfo", "Ruleset")
+ .WithMany()
+ .HasForeignKey("RulesetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapMetadata", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo")
+ .WithOne("Metadata")
+ .HasForeignKey("osu.Game.Beatmaps.BeatmapMetadata", "BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo")
+ .WithMany("Files")
+ .HasForeignKey("BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.IO.FileInfo", "FileInfo")
+ .WithMany()
+ .HasForeignKey("FileInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/osu.Game/Migrations/20171009205048_Init.cs b/osu.Game/Migrations/20171009205048_Init.cs
new file mode 100644
index 0000000000..df6410bfac
--- /dev/null
+++ b/osu.Game/Migrations/20171009205048_Init.cs
@@ -0,0 +1,314 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+using System;
+using System.Collections.Generic;
+
+namespace osu.Game.Migrations
+{
+ public partial class Init : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "BeatmapDifficulty",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ ApproachRate = table.Column(type: "REAL", nullable: false),
+ CircleSize = table.Column(type: "REAL", nullable: false),
+ DrainRate = table.Column(type: "REAL", nullable: false),
+ OverallDifficulty = table.Column(type: "REAL", nullable: false),
+ SliderMultiplier = table.Column(type: "REAL", nullable: false),
+ SliderTickRate = table.Column(type: "REAL", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BeatmapDifficulty", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BeatmapSetInfo",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ DeletePending = table.Column(type: "INTEGER", nullable: false),
+ Hash = table.Column(type: "TEXT", nullable: true),
+ Protected = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BeatmapSetInfo", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "FileInfo",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ Hash = table.Column(type: "TEXT", nullable: true),
+ ReferenceCount = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_FileInfo", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "KeyBinding",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ Action = table.Column(type: "INTEGER", nullable: false),
+ Keys = table.Column(type: "TEXT", nullable: true),
+ RulesetInfoId = table.Column(type: "INTEGER", nullable: true),
+ Variant = table.Column(type: "INTEGER", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_KeyBinding", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "RulesetInfo",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ Available = table.Column(type: "INTEGER", nullable: false),
+ InstantiationInfo = table.Column(type: "TEXT", nullable: true),
+ Name = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_RulesetInfo", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BeatmapMetadata",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ Artist = table.Column(type: "TEXT", nullable: true),
+ ArtistUnicode = table.Column(type: "TEXT", nullable: true),
+ AudioFile = table.Column(type: "TEXT", nullable: true),
+ Author = table.Column(type: "TEXT", nullable: true),
+ BackgroundFile = table.Column(type: "TEXT", nullable: true),
+ BeatmapSetInfoId = table.Column(type: "INTEGER", nullable: false),
+ PreviewTime = table.Column(type: "INTEGER", nullable: false),
+ Source = table.Column(type: "TEXT", nullable: true),
+ Tags = table.Column(type: "TEXT", nullable: true),
+ Title = table.Column(type: "TEXT", nullable: true),
+ TitleUnicode = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BeatmapMetadata", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BeatmapMetadata_BeatmapSetInfo_BeatmapSetInfoId",
+ column: x => x.BeatmapSetInfoId,
+ principalTable: "BeatmapSetInfo",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BeatmapSetFileInfo",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ BeatmapSetInfoId = table.Column(type: "INTEGER", nullable: false),
+ FileInfoId = table.Column(type: "INTEGER", nullable: false),
+ Filename = table.Column(type: "TEXT", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BeatmapSetFileInfo", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BeatmapSetFileInfo_BeatmapSetInfo_BeatmapSetInfoId",
+ column: x => x.BeatmapSetInfoId,
+ principalTable: "BeatmapSetInfo",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_BeatmapSetFileInfo_FileInfo_FileInfoId",
+ column: x => x.FileInfoId,
+ principalTable: "FileInfo",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BeatmapInfo",
+ columns: table => new
+ {
+ Id = table.Column(type: "INTEGER", nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ AudioLeadIn = table.Column(type: "INTEGER", nullable: false),
+ BeatDivisor = table.Column(type: "INTEGER", nullable: false),
+ BeatmapDifficultyId = table.Column(type: "INTEGER", nullable: false),
+ BeatmapSetInfoId = table.Column(type: "INTEGER", nullable: false),
+ Countdown = table.Column(type: "INTEGER", nullable: false),
+ DistanceSpacing = table.Column(type: "REAL", nullable: false),
+ GridSize = table.Column(type: "INTEGER", nullable: false),
+ Hash = table.Column(type: "TEXT", nullable: true),
+ Hidden = table.Column(type: "INTEGER", nullable: false),
+ LetterboxInBreaks = table.Column(type: "INTEGER", nullable: false),
+ MD5Hash = table.Column(type: "TEXT", nullable: true),
+ MetadataId = table.Column(type: "INTEGER", nullable: true),
+ Path = table.Column(type: "TEXT", nullable: true),
+ RulesetInfoId = table.Column(type: "INTEGER", nullable: false),
+ SpecialStyle = table.Column(type: "INTEGER", nullable: false),
+ StackLeniency = table.Column(type: "REAL", nullable: false),
+ StarDifficulty = table.Column(type: "REAL", nullable: false),
+ StoredBookmarks = table.Column(type: "TEXT", nullable: true),
+ TimelineZoom = table.Column(type: "REAL", nullable: false),
+ Version = table.Column(type: "TEXT", nullable: true),
+ WidescreenStoryboard = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BeatmapInfo", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BeatmapInfo_BeatmapDifficulty_BeatmapDifficultyId",
+ column: x => x.BeatmapDifficultyId,
+ principalTable: "BeatmapDifficulty",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_BeatmapInfo_BeatmapSetInfo_BeatmapSetInfoId",
+ column: x => x.BeatmapSetInfoId,
+ principalTable: "BeatmapSetInfo",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_BeatmapInfo_BeatmapMetadata_MetadataId",
+ column: x => x.MetadataId,
+ principalTable: "BeatmapMetadata",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_BeatmapInfo_RulesetInfo_RulesetInfoId",
+ column: x => x.RulesetInfoId,
+ principalTable: "RulesetInfo",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapInfo_BeatmapDifficultyId",
+ table: "BeatmapInfo",
+ column: "BeatmapDifficultyId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapInfo_BeatmapSetInfoId",
+ table: "BeatmapInfo",
+ column: "BeatmapSetInfoId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapInfo_MD5Hash",
+ table: "BeatmapInfo",
+ column: "MD5Hash");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapInfo_MetadataId",
+ table: "BeatmapInfo",
+ column: "MetadataId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapInfo_RulesetInfoId",
+ table: "BeatmapInfo",
+ column: "RulesetInfoId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapMetadata_BeatmapSetInfoId",
+ table: "BeatmapMetadata",
+ column: "BeatmapSetInfoId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapSetFileInfo_BeatmapSetInfoId",
+ table: "BeatmapSetFileInfo",
+ column: "BeatmapSetInfoId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapSetFileInfo_FileInfoId",
+ table: "BeatmapSetFileInfo",
+ column: "FileInfoId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BeatmapSetInfo_DeletePending",
+ table: "BeatmapSetInfo",
+ column: "DeletePending");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_FileInfo_Hash",
+ table: "FileInfo",
+ column: "Hash",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_FileInfo_ReferenceCount",
+ table: "FileInfo",
+ column: "ReferenceCount");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_KeyBinding_Action",
+ table: "KeyBinding",
+ column: "Action");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_KeyBinding_Variant",
+ table: "KeyBinding",
+ column: "Variant");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RulesetInfo_Available",
+ table: "RulesetInfo",
+ column: "Available");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RulesetInfo_InstantiationInfo",
+ table: "RulesetInfo",
+ column: "InstantiationInfo",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RulesetInfo_Name",
+ table: "RulesetInfo",
+ column: "Name",
+ unique: true);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "BeatmapInfo");
+
+ migrationBuilder.DropTable(
+ name: "BeatmapSetFileInfo");
+
+ migrationBuilder.DropTable(
+ name: "KeyBinding");
+
+ migrationBuilder.DropTable(
+ name: "BeatmapDifficulty");
+
+ migrationBuilder.DropTable(
+ name: "BeatmapMetadata");
+
+ migrationBuilder.DropTable(
+ name: "RulesetInfo");
+
+ migrationBuilder.DropTable(
+ name: "FileInfo");
+
+ migrationBuilder.DropTable(
+ name: "BeatmapSetInfo");
+ }
+ }
+}
diff --git a/osu.Game/Migrations/OsuDbContextModelSnapshot.cs b/osu.Game/Migrations/OsuDbContextModelSnapshot.cs
new file mode 100644
index 0000000000..d59d2eed09
--- /dev/null
+++ b/osu.Game/Migrations/OsuDbContextModelSnapshot.cs
@@ -0,0 +1,291 @@
+//
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage;
+using osu.Game.Database;
+using System;
+
+namespace osu.Game.Migrations
+{
+ [DbContext(typeof(OsuDbContext))]
+ partial class OsuDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.0.0-rtm-26452");
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapDifficulty", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ApproachRate");
+
+ b.Property("CircleSize");
+
+ b.Property("DrainRate");
+
+ b.Property("OverallDifficulty");
+
+ b.Property("SliderMultiplier");
+
+ b.Property("SliderTickRate");
+
+ b.HasKey("Id");
+
+ b.ToTable("BeatmapDifficulty");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AudioLeadIn");
+
+ b.Property("BeatDivisor");
+
+ b.Property("BeatmapDifficultyId");
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("Countdown");
+
+ b.Property("DistanceSpacing");
+
+ b.Property("GridSize");
+
+ b.Property("Hash");
+
+ b.Property("Hidden");
+
+ b.Property("LetterboxInBreaks");
+
+ b.Property("MD5Hash");
+
+ b.Property("MetadataId");
+
+ b.Property("Path");
+
+ b.Property("RulesetInfoId");
+
+ b.Property("SpecialStyle");
+
+ b.Property("StackLeniency");
+
+ b.Property("StarDifficulty");
+
+ b.Property("StoredBookmarks");
+
+ b.Property("TimelineZoom");
+
+ b.Property("Version");
+
+ b.Property("WidescreenStoryboard");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapDifficultyId");
+
+ b.HasIndex("BeatmapSetInfoId");
+
+ b.HasIndex("MD5Hash");
+
+ b.HasIndex("MetadataId");
+
+ b.HasIndex("RulesetInfoId");
+
+ b.ToTable("BeatmapInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Artist");
+
+ b.Property("ArtistUnicode");
+
+ b.Property("AudioFile");
+
+ b.Property("Author");
+
+ b.Property("BackgroundFile");
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("PreviewTime");
+
+ b.Property("Source");
+
+ b.Property("Tags");
+
+ b.Property("Title");
+
+ b.Property("TitleUnicode");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapSetInfoId")
+ .IsUnique();
+
+ b.ToTable("BeatmapMetadata");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BeatmapSetInfoId");
+
+ b.Property("FileInfoId");
+
+ b.Property("Filename")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("BeatmapSetInfoId");
+
+ b.HasIndex("FileInfoId");
+
+ b.ToTable("BeatmapSetFileInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("DeletePending");
+
+ b.Property("Hash");
+
+ b.Property("Protected");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DeletePending");
+
+ b.ToTable("BeatmapSetInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Input.Bindings.DatabasedKeyBinding", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("IntAction")
+ .HasColumnName("Action");
+
+ b.Property("KeysString")
+ .HasColumnName("Keys");
+
+ b.Property("RulesetInfoId");
+
+ b.Property("Variant");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IntAction");
+
+ b.HasIndex("Variant");
+
+ b.ToTable("KeyBinding");
+ });
+
+ modelBuilder.Entity("osu.Game.IO.FileInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Hash");
+
+ b.Property("ReferenceCount");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Hash")
+ .IsUnique();
+
+ b.HasIndex("ReferenceCount");
+
+ b.ToTable("FileInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Rulesets.RulesetInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Available");
+
+ b.Property("InstantiationInfo");
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Available");
+
+ b.HasIndex("InstantiationInfo")
+ .IsUnique();
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("RulesetInfo");
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapDifficulty", "Difficulty")
+ .WithMany()
+ .HasForeignKey("BeatmapDifficultyId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo", "BeatmapSet")
+ .WithMany("Beatmaps")
+ .HasForeignKey("BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.Beatmaps.BeatmapMetadata", "Metadata")
+ .WithMany()
+ .HasForeignKey("MetadataId");
+
+ b.HasOne("osu.Game.Rulesets.RulesetInfo", "Ruleset")
+ .WithMany()
+ .HasForeignKey("RulesetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapMetadata", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo")
+ .WithOne("Metadata")
+ .HasForeignKey("osu.Game.Beatmaps.BeatmapMetadata", "BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
+ {
+ b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo")
+ .WithMany("Files")
+ .HasForeignKey("BeatmapSetInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("osu.Game.IO.FileInfo", "FileInfo")
+ .WithMany()
+ .HasForeignKey("FileInfoId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index fc25cd7776..b863cb6ea5 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -105,7 +105,6 @@ namespace osu.Game
dependencies.Cache(LocalConfig);
using (var dbContext = createDbContext())
- if (dbContext.Database.GetPendingMigrations().Any())
dbContext.Database.Migrate();
dependencies.Cache(API = new APIAccess
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index afccbe9dc1..d0ba861daa 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -415,6 +415,11 @@
+
+
+ 20171009205048_Init.cs
+
+
@@ -860,9 +865,7 @@
-
-
-
+