Upgrade (again) to EF Core 3.0

This commit is contained in:
Robert McRackan 2019-10-07 22:12:43 -04:00
parent 1e57607a7d
commit b0fec23a51
21 changed files with 298 additions and 1889 deletions

View File

@ -12,13 +12,13 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View File

@ -10,14 +10,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations namespace DataLayer.Migrations
{ {
[DbContext(typeof(LibationContext))] [DbContext(typeof(LibationContext))]
[Migration("20190124192324_EmptyCategorySeed")] [Migration("20191007202808_UpgradeToCore3")]
partial class EmptyCategorySeed partial class UpgradeToCore3
{ {
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687") .HasAnnotation("ProductVersion", "3.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
@ -25,27 +25,35 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("BookId") b.Property<int>("BookId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId"); b.Property<string>("AudibleProductId")
.HasColumnType("nvarchar(450)");
b.Property<int>("CategoryId"); b.Property<int>("CategoryId")
.HasColumnType("int");
b.Property<DateTime?>("DatePublished"); b.Property<DateTime?>("DatePublished")
.HasColumnType("datetime2");
b.Property<string>("Description"); b.Property<string>("Description")
.HasColumnType("nvarchar(max)");
b.Property<bool>("HasBookDetails"); b.Property<bool>("HasBookDetails")
.HasColumnType("bit");
b.Property<bool>("IsAbridged"); b.Property<bool>("IsAbridged")
.HasColumnType("bit");
b.Property<int>("LengthInMinutes"); b.Property<int>("LengthInMinutes")
.HasColumnType("int");
b.Property<string>("PictureId"); b.Property<string>("PictureId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Publisher"); b.Property<string>("Title")
.HasColumnType("nvarchar(max)");
b.Property<string>("Title");
b.HasKey("BookId"); b.HasKey("BookId");
@ -58,13 +66,17 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.BookContributor", b => modelBuilder.Entity("DataLayer.BookContributor", b =>
{ {
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<int>("ContributorId"); b.Property<int>("ContributorId")
.HasColumnType("int");
b.Property<int>("Role"); b.Property<int>("Role")
.HasColumnType("int");
b.Property<byte>("Order"); b.Property<byte>("Order")
.HasColumnType("tinyint");
b.HasKey("BookId", "ContributorId", "Role"); b.HasKey("BookId", "ContributorId", "Role");
@ -79,13 +91,17 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("CategoryId") b.Property<int>("CategoryId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId"); b.Property<string>("AudibleCategoryId")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<int?>("ParentCategoryCategoryId"); b.Property<int?>("ParentCategoryCategoryId")
.HasColumnType("int");
b.HasKey("CategoryId"); b.HasKey("CategoryId");
@ -108,11 +124,14 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("ContributorId") b.Property<int>("ContributorId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId"); b.Property<string>("AudibleAuthorId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.HasKey("ContributorId"); b.HasKey("ContributorId");
@ -123,11 +142,14 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.LibraryBook", b => modelBuilder.Entity("DataLayer.LibraryBook", b =>
{ {
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<DateTime>("DateAdded"); b.Property<DateTime>("DateAdded")
.HasColumnType("datetime2");
b.Property<string>("DownloadBookLink"); b.Property<string>("DownloadBookLink")
.HasColumnType("nvarchar(max)");
b.HasKey("BookId"); b.HasKey("BookId");
@ -138,11 +160,14 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("SeriesId") b.Property<int>("SeriesId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId"); b.Property<string>("AudibleSeriesId")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.HasKey("SeriesId"); b.HasKey("SeriesId");
@ -153,11 +178,14 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.SeriesBook", b => modelBuilder.Entity("DataLayer.SeriesBook", b =>
{ {
b.Property<int>("SeriesId"); b.Property<int>("SeriesId")
.HasColumnType("int");
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<float?>("Index"); b.Property<float?>("Index")
.HasColumnType("real");
b.HasKey("SeriesId", "BookId"); b.HasKey("SeriesId", "BookId");
@ -173,17 +201,45 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Category", "Category") b.HasOne("DataLayer.Category", "Category")
.WithMany() .WithMany()
.HasForeignKey("CategoryId") .HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating")
.HasColumnType("real");
b1.Property<float>("PerformanceRating")
.HasColumnType("real");
b1.Property<float>("StoryRating")
.HasColumnType("real");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.WithOwner()
.HasForeignKey("BookId");
});
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 => b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{ {
b1.Property<int>("SupplementId") b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId"); b1.Property<int>("BookId")
.HasColumnType("int");
b1.Property<string>("Url"); b1.Property<string>("Url")
.HasColumnType("nvarchar(max)");
b1.HasKey("SupplementId"); b1.HasKey("SupplementId");
@ -191,69 +247,47 @@ namespace DataLayer.Migrations
b1.ToTable("Supplement"); b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book") b1.WithOwner("Book")
.WithMany("Supplements") .HasForeignKey("BookId");
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
}); });
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 => b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{ {
b1.Property<int>("BookId"); b1.Property<int>("BookId")
.HasColumnType("int");
b1.Property<string>("Tags"); b1.Property<string>("Tags")
.HasColumnType("nvarchar(max)");
b1.HasKey("BookId"); b1.HasKey("BookId");
b1.ToTable("UserDefinedItem"); b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book") b1.WithOwner("Book")
.WithOne("UserDefinedItem") .HasForeignKey("BookId");
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 => b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{ {
b2.Property<int>("UserDefinedItemBookId"); b2.Property<int>("UserDefinedItemBookId")
.HasColumnType("int");
b2.Property<float>("OverallRating"); b2.Property<float>("OverallRating")
.HasColumnType("real");
b2.Property<float>("PerformanceRating"); b2.Property<float>("PerformanceRating")
.HasColumnType("real");
b2.Property<float>("StoryRating"); b2.Property<float>("StoryRating")
.HasColumnType("real");
b2.HasKey("UserDefinedItemBookId"); b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem"); b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem") b2.WithOwner()
.WithOne("Rating") .HasForeignKey("UserDefinedItemBookId");
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
}); });
}); });
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
}); });
modelBuilder.Entity("DataLayer.BookContributor", b => modelBuilder.Entity("DataLayer.BookContributor", b =>
@ -261,12 +295,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink") .WithMany("ContributorsLink")
.HasForeignKey("BookId") .HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Contributor", "Contributor") b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink") .WithMany("BooksLink")
.HasForeignKey("ContributorId") .HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("DataLayer.Category", b => modelBuilder.Entity("DataLayer.Category", b =>
@ -281,7 +317,8 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithOne() .WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId") .HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("DataLayer.SeriesBook", b => modelBuilder.Entity("DataLayer.SeriesBook", b =>
@ -289,12 +326,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink") .WithMany("SeriesLink")
.HasForeignKey("BookId") .HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Series", "Series") b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink") .WithMany("BooksLink")
.HasForeignKey("SeriesId") .HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -1,10 +1,9 @@
using System; using System;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations namespace DataLayer.Migrations
{ {
public partial class Initial : Migration public partial class UpgradeToCore3 : Migration
{ {
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
@ -13,7 +12,7 @@ namespace DataLayer.Migrations
columns: table => new columns: table => new
{ {
CategoryId = table.Column<int>(nullable: false) CategoryId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), .Annotation("SqlServer:Identity", "1, 1"),
AudibleCategoryId = table.Column<string>(nullable: true), AudibleCategoryId = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true), Name = table.Column<string>(nullable: true),
ParentCategoryCategoryId = table.Column<int>(nullable: true) ParentCategoryCategoryId = table.Column<int>(nullable: true)
@ -34,7 +33,7 @@ namespace DataLayer.Migrations
columns: table => new columns: table => new
{ {
ContributorId = table.Column<int>(nullable: false) ContributorId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), .Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(nullable: true), Name = table.Column<string>(nullable: true),
AudibleAuthorId = table.Column<string>(nullable: true) AudibleAuthorId = table.Column<string>(nullable: true)
}, },
@ -48,7 +47,7 @@ namespace DataLayer.Migrations
columns: table => new columns: table => new
{ {
SeriesId = table.Column<int>(nullable: false) SeriesId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), .Annotation("SqlServer:Identity", "1, 1"),
AudibleSeriesId = table.Column<string>(nullable: true), AudibleSeriesId = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true) Name = table.Column<string>(nullable: true)
}, },
@ -62,7 +61,7 @@ namespace DataLayer.Migrations
columns: table => new columns: table => new
{ {
BookId = table.Column<int>(nullable: false) BookId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), .Annotation("SqlServer:Identity", "1, 1"),
AudibleProductId = table.Column<string>(nullable: true), AudibleProductId = table.Column<string>(nullable: true),
Title = table.Column<string>(nullable: true), Title = table.Column<string>(nullable: true),
Description = table.Column<string>(nullable: true), Description = table.Column<string>(nullable: true),
@ -70,12 +69,11 @@ namespace DataLayer.Migrations
PictureId = table.Column<string>(nullable: true), PictureId = table.Column<string>(nullable: true),
HasBookDetails = table.Column<bool>(nullable: false), HasBookDetails = table.Column<bool>(nullable: false),
IsAbridged = table.Column<bool>(nullable: false), IsAbridged = table.Column<bool>(nullable: false),
Publisher = table.Column<string>(nullable: true),
DatePublished = table.Column<DateTime>(nullable: true), DatePublished = table.Column<DateTime>(nullable: true),
CategoryId = table.Column<int>(nullable: false), CategoryId = table.Column<int>(nullable: false),
Rating_OverallRating = table.Column<float>(nullable: false), Rating_OverallRating = table.Column<float>(nullable: true),
Rating_PerformanceRating = table.Column<float>(nullable: false), Rating_PerformanceRating = table.Column<float>(nullable: true),
Rating_StoryRating = table.Column<float>(nullable: false) Rating_StoryRating = table.Column<float>(nullable: true)
}, },
constraints: table => constraints: table =>
{ {
@ -163,7 +161,7 @@ namespace DataLayer.Migrations
columns: table => new columns: table => new
{ {
SupplementId = table.Column<int>(nullable: false) SupplementId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), .Annotation("SqlServer:Identity", "1, 1"),
BookId = table.Column<int>(nullable: false), BookId = table.Column<int>(nullable: false),
Url = table.Column<string>(nullable: true) Url = table.Column<string>(nullable: true)
}, },
@ -184,9 +182,9 @@ namespace DataLayer.Migrations
{ {
BookId = table.Column<int>(nullable: false), BookId = table.Column<int>(nullable: false),
Tags = table.Column<string>(nullable: true), Tags = table.Column<string>(nullable: true),
Rating_OverallRating = table.Column<float>(nullable: false), Rating_OverallRating = table.Column<float>(nullable: true),
Rating_PerformanceRating = table.Column<float>(nullable: false), Rating_PerformanceRating = table.Column<float>(nullable: true),
Rating_StoryRating = table.Column<float>(nullable: false) Rating_StoryRating = table.Column<float>(nullable: true)
}, },
constraints: table => constraints: table =>
{ {
@ -199,6 +197,11 @@ namespace DataLayer.Migrations
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.InsertData(
table: "Categories",
columns: new[] { "CategoryId", "AudibleCategoryId", "Name", "ParentCategoryCategoryId" },
values: new object[] { -1, "", "", null });
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_BookContributor_BookId", name: "IX_BookContributor_BookId",
table: "BookContributor", table: "BookContributor",

View File

@ -15,7 +15,7 @@ namespace DataLayer.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687") .HasAnnotation("ProductVersion", "3.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
@ -23,25 +23,35 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("BookId") b.Property<int>("BookId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId"); b.Property<string>("AudibleProductId")
.HasColumnType("nvarchar(450)");
b.Property<int>("CategoryId"); b.Property<int>("CategoryId")
.HasColumnType("int");
b.Property<DateTime?>("DatePublished"); b.Property<DateTime?>("DatePublished")
.HasColumnType("datetime2");
b.Property<string>("Description"); b.Property<string>("Description")
.HasColumnType("nvarchar(max)");
b.Property<bool>("HasBookDetails"); b.Property<bool>("HasBookDetails")
.HasColumnType("bit");
b.Property<bool>("IsAbridged"); b.Property<bool>("IsAbridged")
.HasColumnType("bit");
b.Property<int>("LengthInMinutes"); b.Property<int>("LengthInMinutes")
.HasColumnType("int");
b.Property<string>("PictureId"); b.Property<string>("PictureId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Title"); b.Property<string>("Title")
.HasColumnType("nvarchar(max)");
b.HasKey("BookId"); b.HasKey("BookId");
@ -54,13 +64,17 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.BookContributor", b => modelBuilder.Entity("DataLayer.BookContributor", b =>
{ {
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<int>("ContributorId"); b.Property<int>("ContributorId")
.HasColumnType("int");
b.Property<int>("Role"); b.Property<int>("Role")
.HasColumnType("int");
b.Property<byte>("Order"); b.Property<byte>("Order")
.HasColumnType("tinyint");
b.HasKey("BookId", "ContributorId", "Role"); b.HasKey("BookId", "ContributorId", "Role");
@ -75,13 +89,17 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("CategoryId") b.Property<int>("CategoryId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId"); b.Property<string>("AudibleCategoryId")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<int?>("ParentCategoryCategoryId"); b.Property<int?>("ParentCategoryCategoryId")
.HasColumnType("int");
b.HasKey("CategoryId"); b.HasKey("CategoryId");
@ -104,11 +122,14 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("ContributorId") b.Property<int>("ContributorId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId"); b.Property<string>("AudibleAuthorId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.HasKey("ContributorId"); b.HasKey("ContributorId");
@ -119,11 +140,14 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.LibraryBook", b => modelBuilder.Entity("DataLayer.LibraryBook", b =>
{ {
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<DateTime>("DateAdded"); b.Property<DateTime>("DateAdded")
.HasColumnType("datetime2");
b.Property<string>("DownloadBookLink"); b.Property<string>("DownloadBookLink")
.HasColumnType("nvarchar(max)");
b.HasKey("BookId"); b.HasKey("BookId");
@ -134,11 +158,14 @@ namespace DataLayer.Migrations
{ {
b.Property<int>("SeriesId") b.Property<int>("SeriesId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId"); b.Property<string>("AudibleSeriesId")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name"); b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.HasKey("SeriesId"); b.HasKey("SeriesId");
@ -149,11 +176,14 @@ namespace DataLayer.Migrations
modelBuilder.Entity("DataLayer.SeriesBook", b => modelBuilder.Entity("DataLayer.SeriesBook", b =>
{ {
b.Property<int>("SeriesId"); b.Property<int>("SeriesId")
.HasColumnType("int");
b.Property<int>("BookId"); b.Property<int>("BookId")
.HasColumnType("int");
b.Property<float?>("Index"); b.Property<float?>("Index")
.HasColumnType("real");
b.HasKey("SeriesId", "BookId"); b.HasKey("SeriesId", "BookId");
@ -169,17 +199,45 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Category", "Category") b.HasOne("DataLayer.Category", "Category")
.WithMany() .WithMany()
.HasForeignKey("CategoryId") .HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating")
.HasColumnType("real");
b1.Property<float>("PerformanceRating")
.HasColumnType("real");
b1.Property<float>("StoryRating")
.HasColumnType("real");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.WithOwner()
.HasForeignKey("BookId");
});
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 => b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{ {
b1.Property<int>("SupplementId") b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId"); b1.Property<int>("BookId")
.HasColumnType("int");
b1.Property<string>("Url"); b1.Property<string>("Url")
.HasColumnType("nvarchar(max)");
b1.HasKey("SupplementId"); b1.HasKey("SupplementId");
@ -187,69 +245,47 @@ namespace DataLayer.Migrations
b1.ToTable("Supplement"); b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book") b1.WithOwner("Book")
.WithMany("Supplements") .HasForeignKey("BookId");
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
}); });
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 => b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{ {
b1.Property<int>("BookId"); b1.Property<int>("BookId")
.HasColumnType("int");
b1.Property<string>("Tags"); b1.Property<string>("Tags")
.HasColumnType("nvarchar(max)");
b1.HasKey("BookId"); b1.HasKey("BookId");
b1.ToTable("UserDefinedItem"); b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book") b1.WithOwner("Book")
.WithOne("UserDefinedItem") .HasForeignKey("BookId");
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 => b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{ {
b2.Property<int>("UserDefinedItemBookId"); b2.Property<int>("UserDefinedItemBookId")
.HasColumnType("int");
b2.Property<float>("OverallRating"); b2.Property<float>("OverallRating")
.HasColumnType("real");
b2.Property<float>("PerformanceRating"); b2.Property<float>("PerformanceRating")
.HasColumnType("real");
b2.Property<float>("StoryRating"); b2.Property<float>("StoryRating")
.HasColumnType("real");
b2.HasKey("UserDefinedItemBookId"); b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem"); b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem") b2.WithOwner()
.WithOne("Rating") .HasForeignKey("UserDefinedItemBookId");
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
}); });
}); });
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
}); });
modelBuilder.Entity("DataLayer.BookContributor", b => modelBuilder.Entity("DataLayer.BookContributor", b =>
@ -257,12 +293,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink") .WithMany("ContributorsLink")
.HasForeignKey("BookId") .HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Contributor", "Contributor") b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink") .WithMany("BooksLink")
.HasForeignKey("ContributorId") .HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("DataLayer.Category", b => modelBuilder.Entity("DataLayer.Category", b =>
@ -277,7 +315,8 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithOne() .WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId") .HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("DataLayer.SeriesBook", b => modelBuilder.Entity("DataLayer.SeriesBook", b =>
@ -285,12 +324,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book") b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink") .WithMany("SeriesLink")
.HasForeignKey("BookId") .HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Series", "Series") b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink") .WithMany("BooksLink")
.HasForeignKey("SeriesId") .HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -8,7 +8,7 @@ namespace DataLayer
public static class RemoveOrphansCommand public static class RemoveOrphansCommand
{ {
public static int RemoveOrphans(this LibationContext context) public static int RemoveOrphans(this LibationContext context)
=> context.Database.ExecuteSqlCommand(@" => context.Database.ExecuteSqlRaw(@"
delete c delete c
from Contributors c from Contributors c
left join BookContributor bc on c.ContributorId = bc.ContributorId left join BookContributor bc on c.ContributorId = bc.ContributorId

View File

@ -17,31 +17,40 @@ namespace DataLayer.Configurations
// //
entity.Ignore(nameof(Book.Authors)); entity.Ignore(nameof(Book.Authors));
entity.Ignore(nameof(Book.Narrators)); entity.Ignore(nameof(Book.Narrators));
//// these don't seem to matter //// these don't seem to matter
//entity.Ignore(nameof(Book.AuthorNames)); //entity.Ignore(nameof(Book.AuthorNames));
//entity.Ignore(nameof(Book.NarratorNames)); //entity.Ignore(nameof(Book.NarratorNames));
//entity.Ignore(nameof(Book.HasPdfs)); //entity.Ignore(nameof(Book.HasPdfs));
// OwnsMany: "Can only ever appear on navigation properties of other entity types. // OwnsMany: "Can only ever appear on navigation properties of other entity types.
// Are automatically loaded, and can only be tracked by a DbContext alongside their owner." // Are automatically loaded, and can only be tracked by a DbContext alongside their owner."
entity.OwnsMany(b => b.Supplements); entity
.OwnsMany(b => b.Supplements, b_s =>
{
b_s.WithOwner(s => s.Book)
.HasForeignKey(s => s.BookId);
b_s.HasKey(s => s.SupplementId);
});
// even though it's owned, we need to map its backing field // even though it's owned, we need to map its backing field
entity entity
.Metadata .Metadata
.FindNavigation(nameof(Book.Supplements)) .FindNavigation(nameof(Book.Supplements))
.SetPropertyAccessMode(PropertyAccessMode.Field); .SetPropertyAccessMode(PropertyAccessMode.Field);
// owns it 1:1, but store in separate table // owns it 1:1, store in separate table
entity entity
.OwnsOne(b => b.UserDefinedItem, b_udi => b_udi.ToTable(nameof(Book.UserDefinedItem))); .OwnsOne(b => b.UserDefinedItem, b_udi =>
// UserDefinedItem must link back to book so we know how to log changed tags. {
// ie: when a tag changes, we need to get the parent book's product id b_udi.WithOwner(udi => udi.Book)
entity .HasForeignKey(udi => udi.BookId);
.HasOne(b => b.UserDefinedItem) b_udi.Property(udi => udi.BookId).ValueGeneratedNever();
.WithOne(udi => udi.Book) b_udi.ToTable(nameof(Book.UserDefinedItem));
.HasForeignKey<UserDefinedItem>(udi => udi.BookId);
entity // owns it 1:1, store in same table
b_udi.OwnsOne(udi => udi.Rating);
});
entity
.Metadata .Metadata
.FindNavigation(nameof(Book.ContributorsLink)) .FindNavigation(nameof(Book.ContributorsLink))
// PropertyAccessMode.Field : Contributions is a get-only property, not a field, so use its backing field // PropertyAccessMode.Field : Contributions is a get-only property, not a field, so use its backing field
@ -57,6 +66,6 @@ namespace DataLayer.Configurations
.HasOne(b => b.Category) .HasOne(b => b.Category)
.WithMany() .WithMany()
.HasForeignKey(b => b.CategoryId); .HasForeignKey(b => b.CategoryId);
} }
} }
} }

View File

@ -1,17 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace DataLayer.Configurations
{
internal class SupplementConfig : IEntityTypeConfiguration<Supplement>
{
public void Configure(EntityTypeBuilder<Supplement> entity)
{
entity.HasKey(s => s.SupplementId);
entity
.HasOne(s => s.Book)
.WithMany(b => b.Supplements)
.HasForeignKey(s => s.BookId);
}
}
}

View File

@ -1,13 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace DataLayer.Configurations
{
internal class UserDefinedItemConfig : IEntityTypeConfiguration<UserDefinedItem>
{
public void Configure(EntityTypeBuilder<UserDefinedItem> entity)
{
entity.OwnsOne(p => p.Rating);
}
}
}

View File

@ -51,8 +51,6 @@ namespace DataLayer
modelBuilder.ApplyConfiguration(new BookConfig()); modelBuilder.ApplyConfiguration(new BookConfig());
modelBuilder.ApplyConfiguration(new ContributorConfig()); modelBuilder.ApplyConfiguration(new ContributorConfig());
modelBuilder.ApplyConfiguration(new BookContributorConfig()); modelBuilder.ApplyConfiguration(new BookContributorConfig());
modelBuilder.ApplyConfiguration(new SupplementConfig());
modelBuilder.ApplyConfiguration(new UserDefinedItemConfig());
modelBuilder.ApplyConfiguration(new LibraryBookConfig()); modelBuilder.ApplyConfiguration(new LibraryBookConfig());
modelBuilder.ApplyConfiguration(new SeriesConfig()); modelBuilder.ApplyConfiguration(new SeriesConfig());
modelBuilder.ApplyConfiguration(new SeriesBookConfig()); modelBuilder.ApplyConfiguration(new SeriesBookConfig());

View File

@ -1,294 +0,0 @@
// <auto-generated />
using System;
using DataLayer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190114190811_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("DataLayer.Book", b =>
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId");
b.Property<int>("CategoryId");
b.Property<DateTime?>("DatePublished");
b.Property<string>("Description");
b.Property<bool>("HasBookDetails");
b.Property<bool>("IsAbridged");
b.Property<int>("LengthInMinutes");
b.Property<string>("PictureId");
b.Property<string>("Publisher");
b.Property<string>("Title");
b.HasKey("BookId");
b.HasIndex("AudibleProductId");
b.HasIndex("CategoryId");
b.ToTable("Books");
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.Property<int>("BookId");
b.Property<int>("ContributorId");
b.Property<int>("Role");
b.Property<byte>("Order");
b.HasKey("BookId", "ContributorId", "Role");
b.HasIndex("BookId");
b.HasIndex("ContributorId");
b.ToTable("BookContributor");
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId");
b.Property<string>("Name");
b.Property<int?>("ParentCategoryCategoryId");
b.HasKey("CategoryId");
b.HasIndex("AudibleCategoryId");
b.HasIndex("ParentCategoryCategoryId");
b.ToTable("Categories");
});
modelBuilder.Entity("DataLayer.Contributor", b =>
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId");
b.Property<string>("Name");
b.HasKey("ContributorId");
b.HasIndex("Name");
b.ToTable("Contributors");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.Property<int>("BookId");
b.Property<DateTime>("DateAdded");
b.Property<string>("DownloadBookLink");
b.HasKey("BookId");
b.ToTable("Library");
});
modelBuilder.Entity("DataLayer.Series", b =>
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId");
b.Property<string>("Name");
b.HasKey("SeriesId");
b.HasIndex("AudibleSeriesId");
b.ToTable("Series");
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.Property<int>("SeriesId");
b.Property<int>("BookId");
b.Property<float?>("Index");
b.HasKey("SeriesId", "BookId");
b.HasIndex("BookId");
b.HasIndex("SeriesId");
b.ToTable("SeriesBook");
});
modelBuilder.Entity("DataLayer.Book", b =>
{
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade);
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId");
b1.Property<string>("Url");
b1.HasKey("SupplementId");
b1.HasIndex("BookId");
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
});
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{
b1.Property<int>("BookId");
b1.Property<string>("Tags");
b1.HasKey("BookId");
b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{
b2.Property<int>("UserDefinedItemBookId");
b2.Property<float>("OverallRating");
b2.Property<float>("PerformanceRating");
b2.Property<float>("StoryRating");
b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.HasOne("DataLayer.Category", "ParentCategory")
.WithMany()
.HasForeignKey("ParentCategoryCategoryId");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,293 +0,0 @@
// <auto-generated />
using System;
using DataLayer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190114191724_NullableCategory")]
partial class NullableCategory
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("DataLayer.Book", b =>
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId");
b.Property<int?>("CategoryId");
b.Property<DateTime?>("DatePublished");
b.Property<string>("Description");
b.Property<bool>("HasBookDetails");
b.Property<bool>("IsAbridged");
b.Property<int>("LengthInMinutes");
b.Property<string>("PictureId");
b.Property<string>("Publisher");
b.Property<string>("Title");
b.HasKey("BookId");
b.HasIndex("AudibleProductId");
b.HasIndex("CategoryId");
b.ToTable("Books");
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.Property<int>("BookId");
b.Property<int>("ContributorId");
b.Property<int>("Role");
b.Property<byte>("Order");
b.HasKey("BookId", "ContributorId", "Role");
b.HasIndex("BookId");
b.HasIndex("ContributorId");
b.ToTable("BookContributor");
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId");
b.Property<string>("Name");
b.Property<int?>("ParentCategoryCategoryId");
b.HasKey("CategoryId");
b.HasIndex("AudibleCategoryId");
b.HasIndex("ParentCategoryCategoryId");
b.ToTable("Categories");
});
modelBuilder.Entity("DataLayer.Contributor", b =>
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId");
b.Property<string>("Name");
b.HasKey("ContributorId");
b.HasIndex("Name");
b.ToTable("Contributors");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.Property<int>("BookId");
b.Property<DateTime>("DateAdded");
b.Property<string>("DownloadBookLink");
b.HasKey("BookId");
b.ToTable("Library");
});
modelBuilder.Entity("DataLayer.Series", b =>
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId");
b.Property<string>("Name");
b.HasKey("SeriesId");
b.HasIndex("AudibleSeriesId");
b.ToTable("Series");
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.Property<int>("SeriesId");
b.Property<int>("BookId");
b.Property<float?>("Index");
b.HasKey("SeriesId", "BookId");
b.HasIndex("BookId");
b.HasIndex("SeriesId");
b.ToTable("SeriesBook");
});
modelBuilder.Entity("DataLayer.Book", b =>
{
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.HasForeignKey("CategoryId");
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId");
b1.Property<string>("Url");
b1.HasKey("SupplementId");
b1.HasIndex("BookId");
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
});
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{
b1.Property<int>("BookId");
b1.Property<string>("Tags");
b1.HasKey("BookId");
b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{
b2.Property<int>("UserDefinedItemBookId");
b2.Property<float>("OverallRating");
b2.Property<float>("PerformanceRating");
b2.Property<float>("StoryRating");
b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.HasOne("DataLayer.Category", "ParentCategory")
.WithMany()
.HasForeignKey("ParentCategoryCategoryId");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,50 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations
{
public partial class NullableCategory : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books");
migrationBuilder.AlterColumn<int>(
name: "CategoryId",
table: "Books",
nullable: true,
oldClrType: typeof(int));
migrationBuilder.AddForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books",
column: "CategoryId",
principalTable: "Categories",
principalColumn: "CategoryId",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books");
migrationBuilder.AlterColumn<int>(
name: "CategoryId",
table: "Books",
nullable: false,
oldClrType: typeof(int),
oldNullable: true);
migrationBuilder.AddForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books",
column: "CategoryId",
principalTable: "Categories",
principalColumn: "CategoryId",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -1,293 +0,0 @@
// <auto-generated />
using System;
using DataLayer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190124190012_NullCategory")]
partial class NullCategory
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("DataLayer.Book", b =>
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId");
b.Property<int?>("CategoryId");
b.Property<DateTime?>("DatePublished");
b.Property<string>("Description");
b.Property<bool>("HasBookDetails");
b.Property<bool>("IsAbridged");
b.Property<int>("LengthInMinutes");
b.Property<string>("PictureId");
b.Property<string>("Publisher");
b.Property<string>("Title");
b.HasKey("BookId");
b.HasIndex("AudibleProductId");
b.HasIndex("CategoryId");
b.ToTable("Books");
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.Property<int>("BookId");
b.Property<int>("ContributorId");
b.Property<int>("Role");
b.Property<byte>("Order");
b.HasKey("BookId", "ContributorId", "Role");
b.HasIndex("BookId");
b.HasIndex("ContributorId");
b.ToTable("BookContributor");
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId");
b.Property<string>("Name");
b.Property<int?>("ParentCategoryCategoryId");
b.HasKey("CategoryId");
b.HasIndex("AudibleCategoryId");
b.HasIndex("ParentCategoryCategoryId");
b.ToTable("Categories");
});
modelBuilder.Entity("DataLayer.Contributor", b =>
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId");
b.Property<string>("Name");
b.HasKey("ContributorId");
b.HasIndex("Name");
b.ToTable("Contributors");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.Property<int>("BookId");
b.Property<DateTime>("DateAdded");
b.Property<string>("DownloadBookLink");
b.HasKey("BookId");
b.ToTable("Library");
});
modelBuilder.Entity("DataLayer.Series", b =>
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId");
b.Property<string>("Name");
b.HasKey("SeriesId");
b.HasIndex("AudibleSeriesId");
b.ToTable("Series");
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.Property<int>("SeriesId");
b.Property<int>("BookId");
b.Property<float?>("Index");
b.HasKey("SeriesId", "BookId");
b.HasIndex("BookId");
b.HasIndex("SeriesId");
b.ToTable("SeriesBook");
});
modelBuilder.Entity("DataLayer.Book", b =>
{
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.HasForeignKey("CategoryId");
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId");
b1.Property<string>("Url");
b1.HasKey("SupplementId");
b1.HasIndex("BookId");
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
});
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{
b1.Property<int>("BookId");
b1.Property<string>("Tags");
b1.HasKey("BookId");
b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{
b2.Property<int>("UserDefinedItemBookId");
b2.Property<float>("OverallRating");
b2.Property<float>("PerformanceRating");
b2.Property<float>("StoryRating");
b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.HasOne("DataLayer.Category", "ParentCategory")
.WithMany()
.HasForeignKey("ParentCategoryCategoryId");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,17 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations
{
public partial class NullCategory : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@ -1,294 +0,0 @@
// <auto-generated />
using System;
using DataLayer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190124190057_NonNullCategory")]
partial class NonNullCategory
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("DataLayer.Book", b =>
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId");
b.Property<int>("CategoryId");
b.Property<DateTime?>("DatePublished");
b.Property<string>("Description");
b.Property<bool>("HasBookDetails");
b.Property<bool>("IsAbridged");
b.Property<int>("LengthInMinutes");
b.Property<string>("PictureId");
b.Property<string>("Publisher");
b.Property<string>("Title");
b.HasKey("BookId");
b.HasIndex("AudibleProductId");
b.HasIndex("CategoryId");
b.ToTable("Books");
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.Property<int>("BookId");
b.Property<int>("ContributorId");
b.Property<int>("Role");
b.Property<byte>("Order");
b.HasKey("BookId", "ContributorId", "Role");
b.HasIndex("BookId");
b.HasIndex("ContributorId");
b.ToTable("BookContributor");
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId");
b.Property<string>("Name");
b.Property<int?>("ParentCategoryCategoryId");
b.HasKey("CategoryId");
b.HasIndex("AudibleCategoryId");
b.HasIndex("ParentCategoryCategoryId");
b.ToTable("Categories");
});
modelBuilder.Entity("DataLayer.Contributor", b =>
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId");
b.Property<string>("Name");
b.HasKey("ContributorId");
b.HasIndex("Name");
b.ToTable("Contributors");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.Property<int>("BookId");
b.Property<DateTime>("DateAdded");
b.Property<string>("DownloadBookLink");
b.HasKey("BookId");
b.ToTable("Library");
});
modelBuilder.Entity("DataLayer.Series", b =>
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId");
b.Property<string>("Name");
b.HasKey("SeriesId");
b.HasIndex("AudibleSeriesId");
b.ToTable("Series");
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.Property<int>("SeriesId");
b.Property<int>("BookId");
b.Property<float?>("Index");
b.HasKey("SeriesId", "BookId");
b.HasIndex("BookId");
b.HasIndex("SeriesId");
b.ToTable("SeriesBook");
});
modelBuilder.Entity("DataLayer.Book", b =>
{
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade);
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId");
b1.Property<string>("Url");
b1.HasKey("SupplementId");
b1.HasIndex("BookId");
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
});
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{
b1.Property<int>("BookId");
b1.Property<string>("Tags");
b1.HasKey("BookId");
b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{
b2.Property<int>("UserDefinedItemBookId");
b2.Property<float>("OverallRating");
b2.Property<float>("PerformanceRating");
b2.Property<float>("StoryRating");
b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.HasOne("DataLayer.Category", "ParentCategory")
.WithMany()
.HasForeignKey("ParentCategoryCategoryId");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,50 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations
{
public partial class NonNullCategory : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books");
migrationBuilder.AlterColumn<int>(
name: "CategoryId",
table: "Books",
nullable: false,
oldClrType: typeof(int),
oldNullable: true);
migrationBuilder.AddForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books",
column: "CategoryId",
principalTable: "Categories",
principalColumn: "CategoryId",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books");
migrationBuilder.AlterColumn<int>(
name: "CategoryId",
table: "Books",
nullable: true,
oldClrType: typeof(int));
migrationBuilder.AddForeignKey(
name: "FK_Books_Categories_CategoryId",
table: "Books",
column: "CategoryId",
principalTable: "Categories",
principalColumn: "CategoryId",
onDelete: ReferentialAction.Restrict);
}
}
}

View File

@ -1,23 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations
{
public partial class EmptyCategorySeed : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "Categories",
columns: new[] { "CategoryId", "AudibleCategoryId", "Name", "ParentCategoryCategoryId" },
values: new object[] { -1, "", "", null });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "Categories",
keyColumn: "CategoryId",
keyValue: -1);
}
}
}

View File

@ -1,300 +0,0 @@
// <auto-generated />
using System;
using DataLayer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190124214317_PublisherContrib")]
partial class PublisherContrib
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("DataLayer.Book", b =>
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleProductId");
b.Property<int>("CategoryId");
b.Property<DateTime?>("DatePublished");
b.Property<string>("Description");
b.Property<bool>("HasBookDetails");
b.Property<bool>("IsAbridged");
b.Property<int>("LengthInMinutes");
b.Property<string>("PictureId");
b.Property<string>("Title");
b.HasKey("BookId");
b.HasIndex("AudibleProductId");
b.HasIndex("CategoryId");
b.ToTable("Books");
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.Property<int>("BookId");
b.Property<int>("ContributorId");
b.Property<int>("Role");
b.Property<byte>("Order");
b.HasKey("BookId", "ContributorId", "Role");
b.HasIndex("BookId");
b.HasIndex("ContributorId");
b.ToTable("BookContributor");
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleCategoryId");
b.Property<string>("Name");
b.Property<int?>("ParentCategoryCategoryId");
b.HasKey("CategoryId");
b.HasIndex("AudibleCategoryId");
b.HasIndex("ParentCategoryCategoryId");
b.ToTable("Categories");
b.HasData(
new
{
CategoryId = -1,
AudibleCategoryId = "",
Name = ""
});
});
modelBuilder.Entity("DataLayer.Contributor", b =>
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleAuthorId");
b.Property<string>("Name");
b.HasKey("ContributorId");
b.HasIndex("Name");
b.ToTable("Contributors");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.Property<int>("BookId");
b.Property<DateTime>("DateAdded");
b.Property<string>("DownloadBookLink");
b.HasKey("BookId");
b.ToTable("Library");
});
modelBuilder.Entity("DataLayer.Series", b =>
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("AudibleSeriesId");
b.Property<string>("Name");
b.HasKey("SeriesId");
b.HasIndex("AudibleSeriesId");
b.ToTable("Series");
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.Property<int>("SeriesId");
b.Property<int>("BookId");
b.Property<float?>("Index");
b.HasKey("SeriesId", "BookId");
b.HasIndex("BookId");
b.HasIndex("SeriesId");
b.ToTable("SeriesBook");
});
modelBuilder.Entity("DataLayer.Book", b =>
{
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade);
b.OwnsMany("DataLayer.Supplement", "Supplements", b1 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("BookId");
b1.Property<string>("Url");
b1.HasKey("SupplementId");
b1.HasIndex("BookId");
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
});
b.OwnsOne("DataLayer.UserDefinedItem", "UserDefinedItem", b1 =>
{
b1.Property<int>("BookId");
b1.Property<string>("Tags");
b1.HasKey("BookId");
b1.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.OwnsOne("DataLayer.Rating", "Rating", b2 =>
{
b2.Property<int>("UserDefinedItemBookId");
b2.Property<float>("OverallRating");
b2.Property<float>("PerformanceRating");
b2.Property<float>("StoryRating");
b2.HasKey("UserDefinedItemBookId");
b2.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
b.OwnsOne("DataLayer.Rating", "Rating", b1 =>
{
b1.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<float>("OverallRating");
b1.Property<float>("PerformanceRating");
b1.Property<float>("StoryRating");
b1.HasKey("BookId");
b1.ToTable("Books");
b1.HasOne("DataLayer.Book")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
});
modelBuilder.Entity("DataLayer.BookContributor", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.Category", b =>
{
b.HasOne("DataLayer.Category", "ParentCategory")
.WithMany()
.HasForeignKey("ParentCategoryCategoryId");
});
modelBuilder.Entity("DataLayer.LibraryBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
{
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,22 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DataLayer.Migrations
{
public partial class PublisherContrib : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Publisher",
table: "Books");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Publisher",
table: "Books",
nullable: true);
}
}
}

View File

@ -6,7 +6,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using DataLayer; using DataLayer;
using Dinah.Core; using Dinah.Core;
using Dinah.EntityFrameworkCore; using Dinah.Core.Collections.Generic;
using FileManager; using FileManager;
using InternalUtilities; using InternalUtilities;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -53,7 +53,7 @@ namespace DomainServices
if (productItems == null || !productItems.Any()) if (productItems == null || !productItems.Any())
return (0, 0); return (0, 0);
filterAndValidate(productItems); productItems = filterAndValidate(productItems);
int newEntries; int newEntries;
using (var context = LibationContext.Create()) using (var context = LibationContext.Create())
@ -82,7 +82,7 @@ namespace DomainServices
return (productItems.Count, newEntries); return (productItems.Count, newEntries);
} }
private static void filterAndValidate(List<LibraryDTO> collection) private static List<LibraryDTO> filterAndValidate(List<LibraryDTO> collection)
{ {
//debug//var episodes = collection.Where(dto => dto.IsEpisodes).ToList(); //debug//var episodes = collection.Where(dto => dto.IsEpisodes).ToList();
@ -92,16 +92,19 @@ namespace DomainServices
if (collection.Any(pi => string.IsNullOrWhiteSpace(pi.ProductId))) if (collection.Any(pi => string.IsNullOrWhiteSpace(pi.ProductId)))
throw new Exception("All product items must contain a Product Id"); throw new Exception("All product items must contain a Product Id");
var duplicateIds = collection return collection.DistinctBy(pi => pi.ProductId).ToList();
.GroupBy(pi => pi.ProductId)
.Where(grp => grp.Count() > 1)
.Select(grp => grp.Key);
if (duplicateIds.Any()) // var duplicateIds = collection
throw new Exception("Cannot insert multiples of the same ProductId. Duplicates:" // .GroupBy(pi => pi.ProductId)
+ duplicateIds // .Where(grp => grp.Count() > 1)
.Select(a => "\r\n- " + a) // .Select(grp => grp.Key)
.Aggregate((a, b) => a + b)); //.ToList();
// if (duplicateIds.Any())
// throw new Exception("Cannot insert multiples of the same ProductId. Duplicates:"
// + duplicateIds
// .Select(a => "\r\n- " + a)
// .Aggregate((a, b) => a + b));
} }
#endregion #endregion

View File

@ -5,22 +5,6 @@ scraping code
"legacy inAudible wire-up code" "legacy inAudible wire-up code"
-- end LEGACY --------------------------------------------------------------------------------------------------------------------- -- end LEGACY ---------------------------------------------------------------------------------------------------------------------
-- begin UPGRADE TO EF CORE 3 ---------------------------------------------------------------------------------------------------------------------
dinah.EFCore, DataLayer
2.2.6 == no problem
3.0.0 == problem:
System.InvalidOperationException: 'The type 'UserDefinedItem' cannot be configured as non-owned because an owned entity type with the same name already exists.'
https://github.com/aspnet/EntityFrameworkCore/issues/15681
https://www.infoq.com/news/2019/06/EF-Core-3-Breaking-Changes/
https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities
https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes
new version: WithOwner
usage
.OwnsOne(...).WithOwner()
.OwnsMany(...).WithOwner()
-- end UPGRADE TO EF CORE 3 ---------------------------------------------------------------------------------------------------------------------
-- begin REPLACE SCRAPING WITH API --------------------------------------------------------------------------------------------------------------------- -- begin REPLACE SCRAPING WITH API ---------------------------------------------------------------------------------------------------------------------
incl episodes. eg: "Bill Bryson's Appliance of Science" incl episodes. eg: "Bill Bryson's Appliance of Science"
refining episode retrieval might also get rid of the need for IsEpisodes property refining episode retrieval might also get rid of the need for IsEpisodes property
@ -117,9 +101,7 @@ also touches parts of code which: db write via a hook, search engine re-index
-- end ENHANCEMENT, PERFORMANCE: TAGS --------------------------------------------------------------------------------------------------------------------- -- end ENHANCEMENT, PERFORMANCE: TAGS ---------------------------------------------------------------------------------------------------------------------
-- begin ENHANCEMENT, PERFORMANCE: GRID --------------------------------------------------------------------------------------------------------------------- -- begin ENHANCEMENT, PERFORMANCE: GRID ---------------------------------------------------------------------------------------------------------------------
when a book/pdf is NOT liberated, calculating the grid's [Liberated][NOT d/l'ed] label is very slow when a book/pdf is NOT liberated, calculating the grid's [Liberated][NOT d/l'ed] label is very slow
-- end ENHANCEMENT, PERFORMANCE: GRID --------------------------------------------------------------------------------------------------------------------- -- end ENHANCEMENT, PERFORMANCE: GRID ---------------------------------------------------------------------------------------------------------------------
-- begin ENHANCEMENT: REMOVE BOOK --------------------------------------------------------------------------------------------------------------------- -- begin ENHANCEMENT: REMOVE BOOK ---------------------------------------------------------------------------------------------------------------------