From 1d89ce2009ab98eb541bf4411e4269caa7881d49 Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Sun, 18 Sep 2022 02:06:11 +0800 Subject: [PATCH] Add initial ai battle --- SharedProject/Enums/PlayMode.cs | 2 +- .../Context/TaikoDbContextPartial.cs | 25 + .../Controllers/Game/GetAiDataController.cs | 4 +- .../Controllers/Game/GetAiScoreController.cs | 4 +- TaikoLocalServer/Entities/AiScoreDatum.cs | 16 + .../Entities/AiSectionScoreDatum.cs | 28 ++ .../20220917180457_AddAiBattle.Designer.cs | 432 ++++++++++++++++++ .../Migrations/20220917180457_AddAiBattle.cs | 71 +++ .../Migrations/TaikoDbContextModelSnapshot.cs | 87 ++++ 9 files changed, 663 insertions(+), 6 deletions(-) create mode 100644 TaikoLocalServer/Entities/AiScoreDatum.cs create mode 100644 TaikoLocalServer/Entities/AiSectionScoreDatum.cs create mode 100644 TaikoLocalServer/Migrations/20220917180457_AddAiBattle.Designer.cs create mode 100644 TaikoLocalServer/Migrations/20220917180457_AddAiBattle.cs diff --git a/SharedProject/Enums/PlayMode.cs b/SharedProject/Enums/PlayMode.cs index 0e90705..958a0f6 100644 --- a/SharedProject/Enums/PlayMode.cs +++ b/SharedProject/Enums/PlayMode.cs @@ -5,5 +5,5 @@ public enum PlayMode Normal = 0, DanMode = 1, // Not sure about this - AiBattle = 2 + AiBattle = 6 } \ No newline at end of file diff --git a/TaikoLocalServer/Context/TaikoDbContextPartial.cs b/TaikoLocalServer/Context/TaikoDbContextPartial.cs index 4c3a5b1..a3883fb 100644 --- a/TaikoLocalServer/Context/TaikoDbContextPartial.cs +++ b/TaikoLocalServer/Context/TaikoDbContextPartial.cs @@ -4,6 +4,8 @@ public partial class TaikoDbContext { public virtual DbSet DanScoreData { get; set; } = null!; public virtual DbSet DanStageScoreData { get; set; } = null!; + public virtual DbSet AiScoreData { get; set; } = null!; + public virtual DbSet AiSectionScoreData { get; set; } = null!; partial void OnModelCreatingPartial(ModelBuilder modelBuilder) { @@ -30,5 +32,28 @@ public partial class TaikoDbContext .HasForeignKey(d => new {d.Baid, d.DanId}) .OnDelete(DeleteBehavior.Cascade); }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.SongId, e.Difficulty }); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + }); + + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.SongId, e.Difficulty, e.SectionIndex }); + + entity.HasOne(d => d.Parent) + .WithMany(p => p.AiSectionScoreData) + .HasPrincipalKey(p => new {p.Baid, p.SongId, p.Difficulty }) + .HasForeignKey(d => new {d.Baid, d.SongId, d.Difficulty }) + .OnDelete(DeleteBehavior.Cascade); + }); } } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetAiDataController.cs b/TaikoLocalServer/Controllers/Game/GetAiDataController.cs index 1774285..148875f 100644 --- a/TaikoLocalServer/Controllers/Game/GetAiDataController.cs +++ b/TaikoLocalServer/Controllers/Game/GetAiDataController.cs @@ -13,9 +13,7 @@ public class GetAiDataController : BaseController var response = new GetAiDataResponse { Result = 1, - TotalWinnings = 1, - InputMedian = "1", - InputVariance = "0.576389" + TotalWinnings = 0 }; return Ok(response); diff --git a/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs b/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs index 936fae1..0d56035 100644 --- a/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs +++ b/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs @@ -17,7 +17,7 @@ public class GetAiScoreController : BaseController // There's either 3 or 5 total sections // SectionNo doesn't seem to actually affect which section is being assigned to, only the List order matters - response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + /*response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() { SectionNo = 1, Crown = (uint)CrownType.Clear, @@ -66,7 +66,7 @@ public class GetAiScoreController : BaseController OkCnt = 50, NgCnt = 25, PoundCnt = 12 - }); + });*/ return Ok(response); } diff --git a/TaikoLocalServer/Entities/AiScoreDatum.cs b/TaikoLocalServer/Entities/AiScoreDatum.cs new file mode 100644 index 0000000..c6759cd --- /dev/null +++ b/TaikoLocalServer/Entities/AiScoreDatum.cs @@ -0,0 +1,16 @@ +namespace TaikoLocalServer.Entities; + +public class AiScoreDatum +{ + public uint Baid { get; set; } + + public uint SongId { get; set; } + + public Difficulty Difficulty { get; set; } + + public bool IsWin { get; set; } + + public List AiSectionScoreData { get; set; } = new(); + + public virtual Card? Ba { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Entities/AiSectionScoreDatum.cs b/TaikoLocalServer/Entities/AiSectionScoreDatum.cs new file mode 100644 index 0000000..c6b65e8 --- /dev/null +++ b/TaikoLocalServer/Entities/AiSectionScoreDatum.cs @@ -0,0 +1,28 @@ +namespace TaikoLocalServer.Entities; + +public class AiSectionScoreDatum +{ + public uint Baid { get; set; } + + public uint SongId { get; set; } + + public Difficulty Difficulty { get; set; } + + public int SectionIndex { get; set; } + + public CrownType Crown { get; set; } + + public bool IsWin { get; set; } + + public uint Score { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint MissCount { get; set; } + + public uint DrumrollCount { get; set; } + + public AiScoreDatum Parent { get; set; } = null!; +} \ No newline at end of file diff --git a/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.Designer.cs b/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.Designer.cs new file mode 100644 index 0000000..a71b8c7 --- /dev/null +++ b/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.Designer.cs @@ -0,0 +1,432 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TaikoLocalServer.Context; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220917180457_AddAiBattle")] + partial class AddAiBattle + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.cs b/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.cs new file mode 100644 index 0000000..f3694b9 --- /dev/null +++ b/TaikoLocalServer/Migrations/20220917180457_AddAiBattle.cs @@ -0,0 +1,71 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddAiBattle : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AiScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + IsWin = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AiScoreData", x => new { x.Baid, x.SongId, x.Difficulty }); + table.ForeignKey( + name: "FK_AiScoreData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AiSectionScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + SectionIndex = table.Column(type: "INTEGER", nullable: false), + Crown = table.Column(type: "INTEGER", nullable: false), + IsWin = table.Column(type: "INTEGER", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false), + GoodCount = table.Column(type: "INTEGER", nullable: false), + OkCount = table.Column(type: "INTEGER", nullable: false), + MissCount = table.Column(type: "INTEGER", nullable: false), + DrumrollCount = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AiSectionScoreData", x => new { x.Baid, x.SongId, x.Difficulty, x.SectionIndex }); + table.ForeignKey( + name: "FK_AiSectionScoreData_AiScoreData_Baid_SongId_Difficulty", + columns: x => new { x.Baid, x.SongId, x.Difficulty }, + principalTable: "AiScoreData", + principalColumns: new[] { "Baid", "SongId", "Difficulty" }, + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AiSectionScoreData"); + + migrationBuilder.DropTable( + name: "AiScoreData"); + } + } +} diff --git a/TaikoLocalServer/Migrations/TaikoDbContextModelSnapshot.cs b/TaikoLocalServer/Migrations/TaikoDbContextModelSnapshot.cs index 90b5110..f4951d8 100644 --- a/TaikoLocalServer/Migrations/TaikoDbContextModelSnapshot.cs +++ b/TaikoLocalServer/Migrations/TaikoDbContextModelSnapshot.cs @@ -17,6 +17,65 @@ namespace TaikoLocalServer.Migrations #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => { b.Property("AccessCode") @@ -273,6 +332,29 @@ namespace TaikoLocalServer.Migrations b.ToTable("UserData"); }); + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => { b.HasOne("TaikoLocalServer.Entities.Card", "Ba") @@ -332,6 +414,11 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => { b.Navigation("DanStageScoreData");