|
|
|
@ -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<CatalogContext> 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<Basket>(ConfigureBasket); |
|
|
|
builder.Entity<CatalogBrand>(ConfigureCatalogBrand); |
|
|
|
builder.Entity<CatalogType>(ConfigureCatalogType); |
|
|
|
builder.Entity<CatalogItem>(ConfigureCatalogItem); |
|
|
|
builder.Entity<Order>(ConfigureOrder); |
|
|
|
builder.Entity<OrderItem>(ConfigureOrderItem); |
|
|
|
builder.Entity<Address>(ConfigureAddress); |
|
|
|
builder.Entity<CatalogItemOrdered>(ConfigureCatalogItemOrdered); |
|
|
|
builder.Entity<BasketItem>(ConfigureBasketItem); |
|
|
|
} |
|
|
|
|
|
|
|
private void ConfigureBasketItem(EntityTypeBuilder<BasketItem> builder) |
|
|
|
{ |
|
|
|
builder.Property(bi => bi.UnitPrice) |
|
|
|
.IsRequired(true) |
|
|
|
.HasColumnType("decimal(18,2)"); |
|
|
|
} |
|
|
|
|
|
|
|
private void ConfigureCatalogItemOrdered(EntityTypeBuilder<CatalogItemOrdered> builder) |
|
|
|
{ |
|
|
|
builder.Property(cio => cio.ProductName) |
|
|
|
.HasMaxLength(50) |
|
|
|
.IsRequired(); |
|
|
|
} |
|
|
|
|
|
|
|
private void ConfigureAddress(EntityTypeBuilder<Address> 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<Basket> builder) |
|
|
|
{ |
|
|
|
var navigation = builder.Metadata.FindNavigation(nameof(Basket.Items)); |
|
|
|
|
|
|
|
navigation.SetPropertyAccessMode(PropertyAccessMode.Field); |
|
|
|
} |
|
|
|
|
|
|
|
private void ConfigureCatalogItem(EntityTypeBuilder<CatalogItem> 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<CatalogBrand> 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<CatalogType> 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<Order> builder) |
|
|
|
{ |
|
|
|
var navigation = builder.Metadata.FindNavigation(nameof(Order.OrderItems)); |
|
|
|
|
|
|
|
navigation.SetPropertyAccessMode(PropertyAccessMode.Field); |
|
|
|
|
|
|
|
builder.OwnsOne(o => o.ShipToAddress); |
|
|
|
} |
|
|
|
|
|
|
|
private void ConfigureOrderItem(EntityTypeBuilder<OrderItem> builder) |
|
|
|
{ |
|
|
|
builder.OwnsOne(i => i.ItemOrdered); |
|
|
|
|
|
|
|
builder.Property(oi => oi.UnitPrice) |
|
|
|
.IsRequired(true) |
|
|
|
.HasColumnType("decimal(18,2)"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|