Если вы можете избежать вызова .SaveChanges()
в цикле, а лучше сделать это в самом конце, вам будет намного лучше, так как вы избежите многократных обращений к БД. Тем не менее, если вы делаете из этого более 50000 элементов, возможно, вы захотите сделать это в некоторой степени, возможно, из 1000, которые вы называете.
К сожалению, у вас возникли сложности, связанные с необходимостью создания заказа при сохранении для сохранения в другом столбце. Возможно, если вы отслеживаете создаваемые вами заказы, когда вы сохраняете пакет, сразу после того, как вы можете сделать это, вы делаете пакетный набор SASNo
для каждого только что созданного и другого .BulkSaveChanges()
?
Для ваших последующих изменений сохранения (когда вы удаляете детали заказа, сохраняете, удаляете заказ, сохраняете), я не вижу необходимости делать это в несколько шагов, но, возможно, мой EF ржавый, и он будет жаловаться. В идеале я бы удалил все эти вызовы на .SaveChanges()
и делал бы это в массовых операциях каждые 1000.
Выше значительно сократило бы количество сетевых вызовов БД, предполагая, что BulkSaveChanges
может справиться со всем этим. По сути, я бы стремился к следующему, но в конце дня это могло бы быть сделано лучше / быстрее без EF.
using (var context = new BbsfDbContext())
{
var sapOrders = ...;
var ordersCreated = new List<..>(); // might wanna initialized this with a size if you have a rough gauge on what % will need creation of loop
//if (sapOrders.Any()) // not needed
//{
foreach (var item in sapOrders.Select((x, index) => new { x, index }))
{
try
{
var order = ...;
var isExist = ...;
if (isExist)
{
// ...
if (order == null)
{
order = new Order { ... };
var savedOrder = context.Orders.Add(order);
//context.SaveChanges();
//order.SASNo = BbsfConsts.KeasOrderNumberPrefix + savedOrder.Id;
ordersCreated.Add(order);
}
else
{
// Do updates
// ...
}
}
else
{
//if (order != null) // shouldn't need this
//{
var orderDetails = context.OrderDetails.Where(p => p.OrderId == order.Id).ToList();
orderDetails?.ForEach(p => context.OrderDetails.Remove(p));
//context.SaveChanges();
context.Orders.Remove(order);
//context.SaveChanges();
//}
}
// ...
if (index % 1000 == 0)
{
context.BulkSaveChanges(); // bulk save of 1000 loops of changes
foreach (var orderCreated in ordersCreated)
{
orderCreated.SASNo = BbsfConsts.KeasOrderNumberPrefix + savedOrder.Id;
}
context.BulkSaveChanges(); // bulk save of x num of SASNo sets
}
}
catch (Exception ex)
{
// ...
}
}
}
}
}