void PurchaseApplicationRepository.Create(Domain.PurchaseApplication purchaseApplication)
        {
            using var dbContext = new PurchaseApplicationDbContext();
            var dbEntity = BuildDbPurchaseApplication(purchaseApplication);

            dbContext.PurchaseApplications.Add(dbEntity);
            dbContext.SaveChanges();
        }
        public void Update(Domain.PurchaseApplication purchaseApplication)
        {
            using var dbContext = new PurchaseApplicationDbContext();
            var purchaseApplicationPersistenceState = purchaseApplication.PersistenceState;
            var id       = purchaseApplication.Id.State.Value;
            var dbEntity = dbContext.PurchaseApplications.FirstOrDefault(x => x.Id == id);

            if (dbEntity == null)
            {
                return;
            }
            dbEntity.RejectionDateTime = purchaseApplicationPersistenceState.Rejection.Map(x => x.DateTime).ToNullable();
            dbEntity.RejectionReason   = purchaseApplicationPersistenceState.Rejection.Map(x => x.Reason.Value).IfNoneUnsafe(() => null);
            dbContext.SaveChanges();
        }
        private static DbContext.PurchaseApplication BuildDbPurchaseApplication(Domain.PurchaseApplication purchaseApplication)
        {
            var state = purchaseApplication.PersistenceState;

            return(new DbContext.PurchaseApplication
            {
                Id = state.Id.Value,
                Products = state.Products.Map(BuildDbProduct).ToList(),
                Client = BuildDbClient(),
                AdditionalInformation = state.AdditionalInformation.MatchUnsafe(None: () => null, Some: x => x.Value),
                CreationDateTime = state.CreationDateTime
            });

            Product BuildDbProduct(Domain.Entities.Product.PersistenceState product)
            {
                return(new Product
                {
                    Id = product.Id.Value,
                    Link = product.Link.Value,
                    Units = product.Units.Value,
                    PromotionCode = product.PromotionCode.MatchUnsafe(None: () => null, Some: x => x.Value),
                    AdditionalInformation = product.AdditionalInformation.MatchUnsafe(None: () => null, Some: x => x.Value)
                });
            }

            Client BuildDbClient()
            {
                return(new Client
                {
                    Id = state.Client.Id.Value,
                    Email = state.Client.Email.Value,
                    Name = state.Client.Name.Value,
                    PhoneNumber = state.Client.PhoneNumber.Value
                });
            }
        }