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>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@ -10,14 +10,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DataLayer.Migrations
{
[DbContext(typeof(LibationContext))]
[Migration("20190124192324_EmptyCategorySeed")]
partial class EmptyCategorySeed
[Migration("20191007202808_UpgradeToCore3")]
partial class UpgradeToCore3
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("ProductVersion", "3.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
@ -25,27 +25,35 @@ namespace DataLayer.Migrations
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
b.Property<string>("Title")
.HasColumnType("nvarchar(max)");
b.HasKey("BookId");
@ -58,13 +66,17 @@ namespace DataLayer.Migrations
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");
@ -79,13 +91,17 @@ namespace DataLayer.Migrations
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -108,11 +124,14 @@ namespace DataLayer.Migrations
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -123,11 +142,14 @@ namespace DataLayer.Migrations
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");
@ -138,11 +160,14 @@ namespace DataLayer.Migrations
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -153,11 +178,14 @@ namespace DataLayer.Migrations
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");
@ -173,17 +201,45 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.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 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -191,69 +247,47 @@ namespace DataLayer.Migrations
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.WithOwner("Book")
.HasForeignKey("BookId");
});
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.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.WithOwner("Book")
.HasForeignKey("BookId");
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.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
b2.WithOwner()
.HasForeignKey("UserDefinedItemBookId");
});
});
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 =>
@ -261,12 +295,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("DataLayer.Category", b =>
@ -281,7 +317,8 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
@ -289,12 +326,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}

View File

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

View File

@ -15,7 +15,7 @@ namespace DataLayer.Migrations
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
.HasAnnotation("ProductVersion", "3.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
@ -23,25 +23,35 @@ namespace DataLayer.Migrations
{
b.Property<int>("BookId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -54,13 +64,17 @@ namespace DataLayer.Migrations
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");
@ -75,13 +89,17 @@ namespace DataLayer.Migrations
{
b.Property<int>("CategoryId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -104,11 +122,14 @@ namespace DataLayer.Migrations
{
b.Property<int>("ContributorId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -119,11 +140,14 @@ namespace DataLayer.Migrations
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");
@ -134,11 +158,14 @@ namespace DataLayer.Migrations
{
b.Property<int>("SeriesId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -149,11 +176,14 @@ namespace DataLayer.Migrations
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");
@ -169,17 +199,45 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Category", "Category")
.WithMany()
.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 =>
{
b1.Property<int>("SupplementId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.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");
@ -187,69 +245,47 @@ namespace DataLayer.Migrations
b1.ToTable("Supplement");
b1.HasOne("DataLayer.Book", "Book")
.WithMany("Supplements")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.WithOwner("Book")
.HasForeignKey("BookId");
});
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.ToTable("UserDefinedItem");
b1.HasOne("DataLayer.Book", "Book")
.WithOne("UserDefinedItem")
.HasForeignKey("DataLayer.UserDefinedItem", "BookId")
.OnDelete(DeleteBehavior.Cascade);
b1.WithOwner("Book")
.HasForeignKey("BookId");
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.ToTable("UserDefinedItem");
b2.HasOne("DataLayer.UserDefinedItem")
.WithOne("Rating")
.HasForeignKey("DataLayer.Rating", "UserDefinedItemBookId")
.OnDelete(DeleteBehavior.Cascade);
b2.WithOwner()
.HasForeignKey("UserDefinedItemBookId");
});
});
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 =>
@ -257,12 +293,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithMany("ContributorsLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Contributor", "Contributor")
.WithMany("BooksLink")
.HasForeignKey("ContributorId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("DataLayer.Category", b =>
@ -277,7 +315,8 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithOne()
.HasForeignKey("DataLayer.LibraryBook", "BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("DataLayer.SeriesBook", b =>
@ -285,12 +324,14 @@ namespace DataLayer.Migrations
b.HasOne("DataLayer.Book", "Book")
.WithMany("SeriesLink")
.HasForeignKey("BookId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DataLayer.Series", "Series")
.WithMany("BooksLink")
.HasForeignKey("SeriesId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}

View File

@ -8,7 +8,7 @@ namespace DataLayer
public static class RemoveOrphansCommand
{
public static int RemoveOrphans(this LibationContext context)
=> context.Database.ExecuteSqlCommand(@"
=> context.Database.ExecuteSqlRaw(@"
delete c
from Contributors c
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.Narrators));
//// these don't seem to matter
//entity.Ignore(nameof(Book.AuthorNames));
//entity.Ignore(nameof(Book.NarratorNames));
//entity.Ignore(nameof(Book.HasPdfs));
//// these don't seem to matter
//entity.Ignore(nameof(Book.AuthorNames));
//entity.Ignore(nameof(Book.NarratorNames));
//entity.Ignore(nameof(Book.HasPdfs));
// 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."
entity.OwnsMany(b => b.Supplements);
// 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."
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
entity
.Metadata
.FindNavigation(nameof(Book.Supplements))
.SetPropertyAccessMode(PropertyAccessMode.Field);
// owns it 1:1, but store in separate table
entity
.OwnsOne(b => b.UserDefinedItem, b_udi => b_udi.ToTable(nameof(Book.UserDefinedItem)));
// 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
entity
.HasOne(b => b.UserDefinedItem)
.WithOne(udi => udi.Book)
.HasForeignKey<UserDefinedItem>(udi => udi.BookId);
// owns it 1:1, store in separate table
entity
.OwnsOne(b => b.UserDefinedItem, b_udi =>
{
b_udi.WithOwner(udi => udi.Book)
.HasForeignKey(udi => udi.BookId);
b_udi.Property(udi => udi.BookId).ValueGeneratedNever();
b_udi.ToTable(nameof(Book.UserDefinedItem));
entity
// owns it 1:1, store in same table
b_udi.OwnsOne(udi => udi.Rating);
});
entity
.Metadata
.FindNavigation(nameof(Book.ContributorsLink))
// 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)
.WithMany()
.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 ContributorConfig());
modelBuilder.ApplyConfiguration(new BookContributorConfig());
modelBuilder.ApplyConfiguration(new SupplementConfig());
modelBuilder.ApplyConfiguration(new UserDefinedItemConfig());
modelBuilder.ApplyConfiguration(new LibraryBookConfig());
modelBuilder.ApplyConfiguration(new SeriesConfig());
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 DataLayer;
using Dinah.Core;
using Dinah.EntityFrameworkCore;
using Dinah.Core.Collections.Generic;
using FileManager;
using InternalUtilities;
using Newtonsoft.Json;
@ -53,7 +53,7 @@ namespace DomainServices
if (productItems == null || !productItems.Any())
return (0, 0);
filterAndValidate(productItems);
productItems = filterAndValidate(productItems);
int newEntries;
using (var context = LibationContext.Create())
@ -82,7 +82,7 @@ namespace DomainServices
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();
@ -92,16 +92,19 @@ namespace DomainServices
if (collection.Any(pi => string.IsNullOrWhiteSpace(pi.ProductId)))
throw new Exception("All product items must contain a Product Id");
var duplicateIds = collection
.GroupBy(pi => pi.ProductId)
.Where(grp => grp.Count() > 1)
.Select(grp => grp.Key);
return collection.DistinctBy(pi => pi.ProductId).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));
// var duplicateIds = collection
// .GroupBy(pi => pi.ProductId)
// .Where(grp => grp.Count() > 1)
// .Select(grp => grp.Key)
//.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

View File

@ -5,22 +5,6 @@ scraping code
"legacy inAudible wire-up code"
-- 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 ---------------------------------------------------------------------------------------------------------------------
incl episodes. eg: "Bill Bryson's Appliance of Science"
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 ---------------------------------------------------------------------------------------------------------------------
-- begin ENHANCEMENT, PERFORMANCE: GRID ---------------------------------------------------------------------------------------------------------------------
when a book/pdf is NOT liberated, calculating the grid's [Liberated][NOT d/l'ed] label is very slow
-- end ENHANCEMENT, PERFORMANCE: GRID ---------------------------------------------------------------------------------------------------------------------
-- begin ENHANCEMENT: REMOVE BOOK ---------------------------------------------------------------------------------------------------------------------