Skip to content

Commit

Permalink
Rolling back change to use extension method to wiret up config
Browse files Browse the repository at this point in the history
- 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).
  • Loading branch information
efleming18 committed Aug 25, 2019
1 parent 3165791 commit d4993ab
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 6 deletions.
1 change: 0 additions & 1 deletion src/ApplicationCore/Entities/OrderAggregate/Address.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate
{
[Owned]
public class Address // ValueObject
{
public String Street { get; private set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
/// </summary>
[Owned]
public class CatalogItemOrdered // ValueObject
{
public CatalogItemOrdered(int catalogItemId, string productName, string pictureUri)
Expand Down
140 changes: 136 additions & 4 deletions src/Infrastructure/Data/CatalogContext.cs
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -22,11 +23,142 @@ public CatalogContext(DbContextOptions<CatalogContext> options) : base(options)

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

0 comments on commit d4993ab

Please sign in to comment.