using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate; using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; using Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork; using System; namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { public class OrderingContext : DbContext,IUnitOfWork { const string DEFAULT_SCHEMA = "ordering"; public DbSet Orders { get; set; } public DbSet OrderItems { get; set; } public DbSet Payments { get; set; } public DbSet Buyers { get; set; } public DbSet CardTypes { get; set; } public DbSet OrderStatus { get; set; } public OrderingContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(ConfigureBuyer); modelBuilder.Entity(ConfigurePayment); modelBuilder.Entity(ConfigureOrder); modelBuilder.Entity(ConfigureOrderItems); modelBuilder.Entity(ConfigureCardTypes); modelBuilder.Entity(ConfigureOrderStatus); } void ConfigureBuyer(EntityTypeBuilder buyerConfiguration) { buyerConfiguration.ToTable("buyers", DEFAULT_SCHEMA); buyerConfiguration.HasKey(b => b.Id); buyerConfiguration.Property(b => b.Id) .ForSqlServerUseSequenceHiLo("buyerseq", DEFAULT_SCHEMA); buyerConfiguration.Property(b=>b.FullName) .HasMaxLength(200) .IsRequired(); buyerConfiguration.HasIndex("FullName") .IsUnique(true); buyerConfiguration.HasMany(b => b.PaymentMethods) .WithOne() .HasForeignKey("BuyerId") .OnDelete(DeleteBehavior.Cascade); var navigation = buyerConfiguration.Metadata.FindNavigation(nameof(Buyer.PaymentMethods)); navigation.SetPropertyAccessMode(PropertyAccessMode.Field); } void ConfigurePayment(EntityTypeBuilder paymentConfiguration) { paymentConfiguration.ToTable("paymentmethods", DEFAULT_SCHEMA); paymentConfiguration.HasKey(b => b.Id); paymentConfiguration.Property(b => b.Id) .ForSqlServerUseSequenceHiLo("paymentseq", DEFAULT_SCHEMA); paymentConfiguration.Property("BuyerId") .IsRequired(); paymentConfiguration.Property("CardHolderName") .HasMaxLength(200) .IsRequired(); paymentConfiguration.Property("Alias") .HasMaxLength(200) .IsRequired(); paymentConfiguration.Property("CardNumber") .HasMaxLength(25) .IsRequired(); paymentConfiguration.Property("Expiration") .IsRequired(); paymentConfiguration.Property("CardTypeId") .IsRequired(); paymentConfiguration.HasOne(p => p.CardType) .WithMany() .HasForeignKey("CardTypeId"); } void ConfigureOrder(EntityTypeBuilder orderConfiguration) { orderConfiguration.ToTable("orders", DEFAULT_SCHEMA); orderConfiguration.HasKey(o => o.Id); orderConfiguration.Property(o => o.Id) .ForSqlServerUseSequenceHiLo("orderseq", DEFAULT_SCHEMA); orderConfiguration.Property("OrderDate").IsRequired(); orderConfiguration.Property("Street").IsRequired(); orderConfiguration.Property("State").IsRequired(); orderConfiguration.Property("City").IsRequired(); orderConfiguration.Property("ZipCode").IsRequired(); orderConfiguration.Property("Country").IsRequired(); orderConfiguration.Property("BuyerId").IsRequired(); orderConfiguration.Property("OrderStatusId").IsRequired(); orderConfiguration.Property("PaymentMethodId").IsRequired(); var navigation = orderConfiguration.Metadata.FindNavigation(nameof(Order.OrderItems)); navigation.SetPropertyAccessMode(PropertyAccessMode.Field); orderConfiguration.HasOne(o => o.PaymentMethod) .WithMany() .HasForeignKey("PaymentMethodId") .OnDelete(DeleteBehavior.Restrict); orderConfiguration.HasOne(o => o.Buyer) .WithMany() .HasForeignKey("BuyerId"); orderConfiguration.HasOne(o => o.OrderStatus) .WithMany() .HasForeignKey("OrderStatusId"); } void ConfigureOrderItems(EntityTypeBuilder orderItemConfiguration) { orderItemConfiguration.ToTable("orderItems", DEFAULT_SCHEMA); orderItemConfiguration.HasKey(o => o.Id); orderItemConfiguration.Property(o => o.Id) .ForSqlServerUseSequenceHiLo("orderitemseq"); orderItemConfiguration.Property("OrderId") .IsRequired(); orderItemConfiguration.Property("Discount") .IsRequired(); orderItemConfiguration.Property("ProductId") .IsRequired(); orderItemConfiguration.Property("ProductName") .IsRequired(); orderItemConfiguration.Property("UnitPrice") .IsRequired(); orderItemConfiguration.Property("Units") .IsRequired(); orderItemConfiguration.Property("PictureUrl") .IsRequired(false); } void ConfigureOrderStatus(EntityTypeBuilder orderStatusConfiguration) { orderStatusConfiguration.ToTable("orderstatus", DEFAULT_SCHEMA); orderStatusConfiguration.HasKey(o => o.Id); orderStatusConfiguration.Property(o => o.Id) .HasDefaultValue(1) .ValueGeneratedNever() .IsRequired(); orderStatusConfiguration.Property(o => o.Name) .HasMaxLength(200) .IsRequired(); } void ConfigureCardTypes(EntityTypeBuilder cardTypesConfiguration) { cardTypesConfiguration.ToTable("cardtypes", DEFAULT_SCHEMA); cardTypesConfiguration.HasKey(ct => ct.Id); cardTypesConfiguration.Property(ct => ct.Id) .HasDefaultValue(1) .ValueGeneratedNever() .IsRequired(); cardTypesConfiguration.Property(ct => ct.Name) .HasMaxLength(200) .IsRequired(); } } }