public async Task <bool> UpdateAttributeRelationAsync(ProductAttributeRelationRequest request)
        {
            if (!request.AttributeRelationValues.Any())
            {
                /// Delete product attribute and all attribute values
                await _productAttributeRelationValueRepository.Get(x => x.ProductAttributeRelationId == request.Id).DeleteAsync();

                await _productAttributeRelationRepository.Get(x => x.Id == request.Id).DeleteAsync();
            }

            var attributeRelationUpdated = await(_productAttributeRelationRepository
                                                 .Get(x => x.Id == request.Id)
                                                 .Set(x => x.IsRequired, request.IsRequired)
                                                 .Set(x => x.ProductAttributeId, request.ProductAttributeId)
                                                 .Set(x => x.TextPrompt, request.TextPrompt)
                                                 .Set(x => x.DisplayOrder, request.DisplayOrder)
                                                 .Set(x => x.AttributeControlTypeId, request.ControlTypeId)
                                                 .UpdateAsync());

            if (attributeRelationUpdated == 0)
            {
                return(false);
            }

            var attributeRelationValueIds = request.AttributeRelationValues.Where(x => x.Id != 0).Select(x => x.Id);
            await _productAttributeRelationValueRepository
            .Get(x => x.ProductAttributeRelationId == request.Id && x.Id.NotIn(attributeRelationValueIds)).DeleteAsync();

            foreach (var attributeValue in request.AttributeRelationValues)
            {
                var isAttributeValueExist = attributeValue.Id != 0 && await _productAttributeRelationValueRepository
                                            .Get(x => x.Id == attributeValue.Id).AnyAsync();

                if (!isAttributeValueExist)
                {
                    await CreateAttributeRelationValueAsync(request.Id, attributeValue);
                }
                else
                {
                    var attributeValueUpdated = await(_productAttributeRelationValueRepository
                                                      .Get(x => x.Id == attributeValue.Id)
                                                      .Set(x => x.PriceAdjustment, attributeValue.PriceAdjustment)
                                                      .Set(x => x.PricePercentageAdjustment, attributeValue.PricePercentageAdjustment)
                                                      .Set(x => x.Name, attributeValue.Name)
                                                      .Set(x => x.Quantity, attributeValue.Quantity)
                                                      .Set(x => x.DisplayOrder, attributeValue.DisplayOrder)
                                                      .UpdateAsync());
                }
            }

            return(true);
        }
        public async Task CreateAttributeRelationAsync(ProductAttributeRelationRequest request)
        {
            var productAttributeRelationId = await _productAttributeRelationRepository.AddWithInt32EntityAsync(new ProductAttributeRelation
            {
                AttributeControlTypeId = request.ControlTypeId,
                DisplayOrder           = request.DisplayOrder,
                IsRequired             = request.IsRequired,
                ProductAttributeId     = request.ProductAttributeId,
                ProductId  = request.ProductId,
                TextPrompt = request.TextPrompt
            });

            if (request.AttributeRelationValues.Any())
            {
                foreach (var attributeValue in request.AttributeRelationValues)
                {
                    await CreateAttributeRelationValueAsync(productAttributeRelationId, attributeValue);
                }
            }
        }