From d4993abd5f81ad01f8f90599d33cca3bc88f9832 Mon Sep 17 00:00:00 2001 From: Eric Fleming Date: Sat, 24 Aug 2019 21:55:41 -0400 Subject: [PATCH] Rolling back change to use extension method to wiret up config - The change is a better way to do the configuration, but there is currently an issue where the Value Objects are not being honored and being treated like Entitys. When this happens, the container will throw errors when trying to start up because the entitys are lacking primary keys (when they don't need them). --- .../Entities/OrderAggregate/Address.cs | 1 - .../OrderAggregate/CatalogItemOrdered.cs | 1 - src/Infrastructure/Data/CatalogContext.cs | 140 +++++++++++++++++- 3 files changed, 136 insertions(+), 6 deletions(-) diff --git a/src/ApplicationCore/Entities/OrderAggregate/Address.cs b/src/ApplicationCore/Entities/OrderAggregate/Address.cs index 8b5ed5f..f5dfdac 100644 --- a/src/ApplicationCore/Entities/OrderAggregate/Address.cs +++ b/src/ApplicationCore/Entities/OrderAggregate/Address.cs @@ -3,7 +3,6 @@ using System; namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate { - [Owned] public class Address // ValueObject { public String Street { get; private set; } diff --git a/src/ApplicationCore/Entities/OrderAggregate/CatalogItemOrdered.cs b/src/ApplicationCore/Entities/OrderAggregate/CatalogItemOrdered.cs index 2adfe11..760b2a8 100644 --- a/src/ApplicationCore/Entities/OrderAggregate/CatalogItemOrdered.cs +++ b/src/ApplicationCore/Entities/OrderAggregate/CatalogItemOrdered.cs @@ -7,7 +7,6 @@ namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate /// Represents a snapshot of the item that was ordered. If catalog item details change, details of /// the item that was part of a completed order should not change. /// - [Owned] public class CatalogItemOrdered // ValueObject { public CatalogItemOrdered(int catalogItemId, string productName, string pictureUri) diff --git a/src/Infrastructure/Data/CatalogContext.cs b/src/Infrastructure/Data/CatalogContext.cs index 98168d0..021c0f4 100644 --- a/src/Infrastructure/Data/CatalogContext.cs +++ b/src/Infrastructure/Data/CatalogContext.cs @@ -1,11 +1,12 @@ -using Ardalis.EFCore.Extensions; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.eShopWeb.ApplicationCore.Entities; using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; namespace Microsoft.eShopWeb.Infrastructure.Data { + public class CatalogContext : DbContext { public CatalogContext(DbContextOptions options) : base(options) @@ -22,11 +23,142 @@ namespace Microsoft.eShopWeb.Infrastructure.Data protected override void OnModelCreating(ModelBuilder builder) { - base.OnModelCreating(builder); - builder.ApplyAllConfigurationsFromCurrentAssembly(); + //Intentionally rolling back this change to fix issue: https://github.com/dotnet-architecture/eShopOnWeb/issues/292 + //Will follow up after issue has been resolved. + //base.OnModelCreating(builder); + //builder.ApplyAllConfigurationsFromCurrentAssembly(); // alternately this is built-in to EF Core 2.2 //builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); + + builder.Entity(ConfigureBasket); + builder.Entity(ConfigureCatalogBrand); + builder.Entity(ConfigureCatalogType); + builder.Entity(ConfigureCatalogItem); + builder.Entity(ConfigureOrder); + builder.Entity(ConfigureOrderItem); + builder.Entity
(ConfigureAddress); + builder.Entity(ConfigureCatalogItemOrdered); + builder.Entity(ConfigureBasketItem); + } + + private void ConfigureBasketItem(EntityTypeBuilder builder) + { + builder.Property(bi => bi.UnitPrice) + .IsRequired(true) + .HasColumnType("decimal(18,2)"); + } + + private void ConfigureCatalogItemOrdered(EntityTypeBuilder builder) + { + builder.Property(cio => cio.ProductName) + .HasMaxLength(50) + .IsRequired(); + } + + private void ConfigureAddress(EntityTypeBuilder
builder) + { + builder.Property(a => a.ZipCode) + .HasMaxLength(18) + .IsRequired(); + + builder.Property(a => a.Street) + .HasMaxLength(180) + .IsRequired(); + + builder.Property(a => a.State) + .HasMaxLength(60); + + builder.Property(a => a.Country) + .HasMaxLength(90) + .IsRequired(); + + builder.Property(a => a.City) + .HasMaxLength(100) + .IsRequired(); + } + + private void ConfigureBasket(EntityTypeBuilder builder) + { + var navigation = builder.Metadata.FindNavigation(nameof(Basket.Items)); + + navigation.SetPropertyAccessMode(PropertyAccessMode.Field); + } + + private void ConfigureCatalogItem(EntityTypeBuilder builder) + { + builder.ToTable("Catalog"); + + builder.Property(ci => ci.Id) + .ForSqlServerUseSequenceHiLo("catalog_hilo") + .IsRequired(); + + builder.Property(ci => ci.Name) + .IsRequired(true) + .HasMaxLength(50); + + builder.Property(ci => ci.Price) + .IsRequired(true) + .HasColumnType("decimal(18,2)"); + + builder.Property(ci => ci.PictureUri) + .IsRequired(false); + + builder.HasOne(ci => ci.CatalogBrand) + .WithMany() + .HasForeignKey(ci => ci.CatalogBrandId); + + builder.HasOne(ci => ci.CatalogType) + .WithMany() + .HasForeignKey(ci => ci.CatalogTypeId); + } + + private void ConfigureCatalogBrand(EntityTypeBuilder builder) + { + builder.ToTable("CatalogBrand"); + + builder.HasKey(ci => ci.Id); + + builder.Property(ci => ci.Id) + .ForSqlServerUseSequenceHiLo("catalog_brand_hilo") + .IsRequired(); + + builder.Property(cb => cb.Brand) + .IsRequired() + .HasMaxLength(100); + } + + private void ConfigureCatalogType(EntityTypeBuilder builder) + { + builder.ToTable("CatalogType"); + + builder.HasKey(ci => ci.Id); + + builder.Property(ci => ci.Id) + .ForSqlServerUseSequenceHiLo("catalog_type_hilo") + .IsRequired(); + + builder.Property(cb => cb.Type) + .IsRequired() + .HasMaxLength(100); + } + + private void ConfigureOrder(EntityTypeBuilder builder) + { + var navigation = builder.Metadata.FindNavigation(nameof(Order.OrderItems)); + + navigation.SetPropertyAccessMode(PropertyAccessMode.Field); + + builder.OwnsOne(o => o.ShipToAddress); + } + + private void ConfigureOrderItem(EntityTypeBuilder builder) + { + builder.OwnsOne(i => i.ItemOrdered); + + builder.Property(oi => oi.UnitPrice) + .IsRequired(true) + .HasColumnType("decimal(18,2)"); } } }