Пример #1
0
        protected void UpdateProductEntity(Entities.Tenant.Products.Product productEntity, Product productModel)
        {
            PrepareDictionaryCache();
            _mapper.Map(productModel, productEntity);

            var productAdvertiser = productEntity.ProductAdvertisers.FirstOrDefault();

            if (productEntity.ProductAdvertisers.Count == 1 &&
                productAdvertiser.Advertiser.ExternalIdentifier == productModel.AdvertiserIdentifier &&
                productAdvertiser.Advertiser.Name == productModel.AdvertiserName)
            {
                productAdvertiser.StartDate = productModel.AdvertiserLinkStartDate;
                productAdvertiser.EndDate   = productModel.AdvertiserLinkEndDate;
            }
            else
            {
                _dbContext.RemoveRange(productEntity.ProductAdvertisers.ToArray());
                productEntity.ProductAdvertisers.Clear();

                if (!string.IsNullOrWhiteSpace(productModel.AdvertiserIdentifier))
                {
                    if (_dbAdvertisers.TryGetValue(productModel.AdvertiserIdentifier, out var dbAdv))
                    {
                        if (!string.Equals(dbAdv.Name, productModel.AdvertiserName))
                        {
                            dbAdv.Name = productModel.AdvertiserName;
                        }
                    }
                    else
                    {
                        dbAdv = new Advertiser
                        {
                            ExternalIdentifier = productModel.AdvertiserIdentifier,
                            Name      = productModel.AdvertiserName,
                            ShortName = productModel.AdvertiserName
                        };
                        _dbContext.Add(dbAdv);
                        _dbAdvertisers.Add(dbAdv.ExternalIdentifier, dbAdv);
                    }

                    productAdvertiser = new ProductAdvertiser
                    {
                        Product    = productEntity,
                        Advertiser = dbAdv,
                        StartDate  = productModel.AdvertiserLinkStartDate,
                        EndDate    = productModel.AdvertiserLinkEndDate
                    };
                    _dbContext.Add(productAdvertiser);
                    productEntity.ProductAdvertisers.Add(productAdvertiser);
                }
            }

            var productAgency = productEntity.ProductAgencies.FirstOrDefault();

            if (productEntity.ProductAgencies.Count == 1 &&
                productAgency.Agency.ExternalIdentifier == productModel.AgencyIdentifier &&
                productAgency.Agency.Name == productModel.AgencyName)
            {
                productAgency.StartDate = productModel.AgencyStartDate;
                productAgency.EndDate   = productModel.AgencyLinkEndDate;
            }
            else
            {
                _dbContext.RemoveRange(productEntity.ProductAgencies.ToArray());
                productEntity.ProductAgencies.Clear();

                if (!string.IsNullOrWhiteSpace(productModel.AgencyIdentifier))
                {
                    Entities.Tenant.AgencyGroup dbAgencyGroup = null;
                    if (productModel.AgencyGroup != null)
                    {
                        var key = HashCode.Combine(productModel.AgencyGroup.ShortName, productModel.AgencyGroup.Code);
                        if (!_dbAgencyGroups.TryGetValue(key, out dbAgencyGroup))
                        {
                            dbAgencyGroup = _mapper.Map <Entities.Tenant.AgencyGroup>(productModel.AgencyGroup);
                            _dbContext.Add(dbAgencyGroup);
                            _dbAgencyGroups.Add(key, dbAgencyGroup);
                        }
                    }

                    if (_dbAgencies.TryGetValue(productModel.AgencyIdentifier, out var dbAgency))
                    {
                        if (!string.Equals(dbAgency.Name, productModel.AgencyName))
                        {
                            dbAgency.Name = productModel.AgencyName;
                        }
                    }
                    else
                    {
                        dbAgency = new Agency
                        {
                            ExternalIdentifier = productModel.AgencyIdentifier,
                            Name      = productModel.AgencyName,
                            ShortName = productModel.AgencyName
                        };
                        _dbContext.Add(dbAgency);
                        _dbAgencies.Add(dbAgency.ExternalIdentifier, dbAgency);
                    }

                    productAgency = new ProductAgency
                    {
                        Product     = productEntity,
                        Agency      = dbAgency,
                        AgencyGroup = dbAgencyGroup,
                        StartDate   = productModel.AgencyStartDate,
                        EndDate     = productModel.AgencyLinkEndDate
                    };
                    _dbContext.Add(productAgency);
                    productEntity.ProductAgencies.Add(productAgency);
                }
            }

            var productPerson = productEntity.ProductPersons.FirstOrDefault();

            if (productEntity.ProductPersons.Count == 1 &&
                productPerson.Person.ExternalIdentifier == productModel.SalesExecutive?.Identifier &&
                productPerson.Person.Name == productModel.SalesExecutive?.Name)
            {
                productPerson.StartDate = productModel.SalesExecutive.StartDate;
                productPerson.EndDate   = productModel.SalesExecutive.EndDate;
            }
            else
            {
                _dbContext.RemoveRange(productEntity.ProductPersons.ToArray());
                productEntity.ProductPersons.Clear();

                if (!(productModel.SalesExecutive is null))
                {
                    if (_dbPersons.TryGetValue(productModel.SalesExecutive.Identifier, out var dbPerson))
                    {
                        if (!string.Equals(dbPerson.Name, productModel.SalesExecutive.Name))
                        {
                            dbPerson.Name = productModel.SalesExecutive.Name;
                        }
                    }
                    else
                    {
                        dbPerson = _mapper.Map <Person>(productModel.SalesExecutive);
                        _dbContext.Add(dbPerson);
                        _dbPersons.Add(dbPerson.ExternalIdentifier, dbPerson);
                    }

                    productPerson = new ProductPerson
                    {
                        Product   = productEntity,
                        Person    = dbPerson,
                        StartDate = productModel.SalesExecutive.StartDate,
                        EndDate   = productModel.SalesExecutive.EndDate
                    };
                    _dbContext.Add(productPerson);
                    productEntity.ProductPersons.Add(productPerson);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// BulkInsert method, only for insert. It doesn't need SaveChanges for
        /// applying changes.
        /// </summary>
        /// <param name="items"></param>
        public void Add(IEnumerable <Product> items)
        {
            if (!(items?.Any() ?? false))
            {
                return;
            }

            PrepareDictionaryCache();
            var products           = new List <Entities.Tenant.Products.Product>();
            var advertisers        = new List <Advertiser>();
            var agencies           = new List <Agency>();
            var agencyGroups       = new List <Entities.Tenant.AgencyGroup>();
            var persons            = new List <Person>();
            var productAdvertisers = new List <ProductAdvertiser>();
            var productAgencies    = new List <ProductAgency>();
            var productPersons     = new List <ProductPerson>();

            foreach (var item in items)
            {
                var product = _mapper.Map <Entities.Tenant.Products.Product>(item);
                products.Add(product);
                if (!string.IsNullOrWhiteSpace(item.AdvertiserIdentifier))
                {
                    if (_dbAdvertisers.TryGetValue(item.AdvertiserIdentifier, out var dbAdv))
                    {
                        if (!string.Equals(dbAdv.Name, item.AdvertiserName))
                        {
                            dbAdv.Name = item.AdvertiserName;
                            advertisers.Add(dbAdv);
                        }
                    }
                    else
                    {
                        dbAdv = new Advertiser
                        {
                            ExternalIdentifier = item.AdvertiserIdentifier,
                            Name      = item.AdvertiserName,
                            ShortName = item.AdvertiserName
                        };
                        advertisers.Add(dbAdv);
                        _dbAdvertisers.Add(dbAdv.ExternalIdentifier, dbAdv);
                    }

                    var productAdvertiser = new ProductAdvertiser
                    {
                        Product    = product,
                        Advertiser = dbAdv,
                        StartDate  = item.AdvertiserLinkStartDate,
                        EndDate    = item.AdvertiserLinkEndDate
                    };
                    productAdvertisers.Add(productAdvertiser);
                    product.ProductAdvertisers.Add(productAdvertiser);
                }

                if (!string.IsNullOrWhiteSpace(item.AgencyIdentifier))
                {
                    Entities.Tenant.AgencyGroup dbAgencyGroup = null;
                    if (item.AgencyGroup != null)
                    {
                        var key = HashCode.Combine(item.AgencyGroup.ShortName, item.AgencyGroup.Code);
                        if (!_dbAgencyGroups.TryGetValue(key, out dbAgencyGroup))
                        {
                            dbAgencyGroup = _mapper.Map <Entities.Tenant.AgencyGroup>(item.AgencyGroup);
                            agencyGroups.Add(dbAgencyGroup);
                            _dbAgencyGroups.Add(key, dbAgencyGroup);
                        }
                    }

                    if (_dbAgencies.TryGetValue(item.AgencyIdentifier, out var dbAgency))
                    {
                        if (!string.Equals(dbAgency.Name, item.AgencyName))
                        {
                            dbAgency.Name = item.AgencyName;
                            agencies.Add(dbAgency);
                        }
                    }
                    else
                    {
                        dbAgency = new Agency
                        {
                            ExternalIdentifier = item.AgencyIdentifier,
                            Name      = item.AgencyName,
                            ShortName = item.AgencyName
                        };
                        agencies.Add(dbAgency);
                        _dbAgencies.Add(dbAgency.ExternalIdentifier, dbAgency);
                    }

                    var productAgency = new ProductAgency
                    {
                        Product     = product,
                        Agency      = dbAgency,
                        AgencyGroup = dbAgencyGroup,
                        StartDate   = item.AgencyStartDate,
                        EndDate     = item.AgencyLinkEndDate
                    };
                    productAgencies.Add(productAgency);
                    product.ProductAgencies.Add(productAgency);
                }

                if (!(item.SalesExecutive is null))
                {
                    if (_dbPersons.TryGetValue(item.SalesExecutive.Identifier, out var dbPerson))
                    {
                        if (!string.Equals(dbPerson.Name, item.SalesExecutive.Name))
                        {
                            dbPerson.Name = item.SalesExecutive.Name;
                            persons.Add(dbPerson);
                        }
                    }
                    else
                    {
                        dbPerson = _mapper.Map <Person>(item.SalesExecutive);
                        persons.Add(dbPerson);
                        _dbPersons.Add(dbPerson.ExternalIdentifier, dbPerson);
                    }

                    var productPerson = new ProductPerson
                    {
                        Product   = product,
                        Person    = dbPerson,
                        StartDate = item.SalesExecutive.StartDate,
                        EndDate   = item.SalesExecutive.EndDate
                    };
                    productPersons.Add(productPerson);
                    product.ProductPersons.Add(productPerson);
                }
            }

            using var transaction = _dbContext.Specific.Database.BeginTransaction();

            if (advertisers.Count > 0)
            {
                _dbContext.BulkInsertEngine.BulkInsertOrUpdate(advertisers,
                                                               new BulkInsertOptions {
                    SetOutputIdentity = true, PreserveInsertOrder = true
                });
            }

            if (agencies.Count > 0)
            {
                _dbContext.BulkInsertEngine.BulkInsertOrUpdate(agencies,
                                                               new BulkInsertOptions {
                    SetOutputIdentity = true, PreserveInsertOrder = true
                });
            }

            if (agencyGroups.Count > 0)
            {
                _dbContext.BulkInsertEngine.BulkInsertOrUpdate(agencyGroups,
                                                               new BulkInsertOptions {
                    SetOutputIdentity = true, PreserveInsertOrder = true
                });
            }

            if (persons.Count > 0)
            {
                _dbContext.BulkInsertEngine.BulkInsertOrUpdate(persons,
                                                               new BulkInsertOptions {
                    SetOutputIdentity = true, PreserveInsertOrder = true
                });
            }

            if (products.Count > 0)
            {
                _dbContext.BulkInsertEngine.BulkInsert(products);
            }

            if (productAdvertisers.Count > 0)
            {
                foreach (var item in productAdvertisers)
                {
                    item.ProductId    = item.Product.Uid;
                    item.AdvertiserId = item.Advertiser.Id;
                }

                _dbContext.BulkInsertEngine.BulkInsert(productAdvertisers);
            }

            if (productAgencies.Count > 0)
            {
                foreach (var item in productAgencies)
                {
                    item.ProductId     = item.Product.Uid;
                    item.AgencyId      = item.Agency.Id;
                    item.AgencyGroupId = item.AgencyGroup?.Id;
                }

                _dbContext.BulkInsertEngine.BulkInsert(productAgencies);
            }

            if (productPersons.Count > 0)
            {
                foreach (var item in productPersons)
                {
                    item.ProductId = item.Product.Uid;
                    item.PersonId  = item.Person.Id;
                }

                _dbContext.BulkInsertEngine.BulkInsert(productPersons);
            }

            transaction.Commit();

            var actionBuilder = new BulkInsertActionBuilder <Entities.Tenant.Products.Product>(products, _mapper);

            actionBuilder.TryToUpdate(items);
            actionBuilder.Build()?.Execute();
        }