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); } } }
/// <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(); }