Я строю .net core 2 api с EF core.
API получает список (3K-5K) объектов (DTO) для синхронизации с использованием общей функции syncItems.
предполагают следующие сущности:
public class supplier
{
[Key]
public string supplierCode { get; set; }
public string name { get; set; }
}
public class item
{
public const int maxItemName = 256;
public const int maxItemCode = 256;
public const int maxBarcode = 256;
[Required]
[StringLength(maxItemName)]
public string itemName { get; set; }
[Required]
[StringLength(maxItemCode)]
[Key]
public string sku { get; set; }
public supplier supplier { get; set; }
public ICollection<itemWarehouse> whslines = new List<itemWarehouse>();
public item()
{
}
}
my sync does the following :
var itemsInApp=_appDbContext.items.ToList();
// insert or update items.
items.ForEach(erpitem =>
{
bool newflag = false;
item tempItem = itemsInApp.Where(x => x.sku == erpitem.sku).FirstOrDefault();
if (tempItem==null) // check if item is null
{
tempItem = new item();
tempItem.sku = erpitem.sku;
newflag = true;
}
tempItem.itemName = erpitem.itemName;
var sup = _appDbContext.suppliers.SingleOrDefault(su=>su.supplierCode==erpitem.supplierCode);
if (sup == null)
{
sup = new supplier { supplierCode = erpitem.supplierCode, name = erpitem.supplierName };
}
tempItem.supplier = sup;
if (newflag)
_appDbContext.items.AddAsync(tempItem);
});
if (_appDbContext.ChangeTracker.HasChanges())
await _appDbContext.SaveChangesAsync();
Это работает очень медленно, а иногда даже зависает (?)
(за счет поставщика)
Я могу извлечь поставщиков из входящего списка и добавить их перед циклом по списку товаров, поэтому код поставщика всегда будет существовать в БД.
Я просто не уверен, что это правильный способ сделать это (?)
большинство онлайн-примеров посвящено обновлению / вставке одного элемента.
Любое понимание / помощь очень ценится.