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)"); } } }