При вставке большого количества строк фактором производительности является DbContext и его кеш отслеживания. Чем больше сущностей отслеживает DbContext, тем больше времени потребуется для принятия изменений и попыток просмотра и обновления всех связей. Для различных больших наборов (10 тысяч или более) вы должны разделить наборы на более управляемые блоки. В вашем случае это может быть необязательным, но я бы проверил, что ваш DbContext максимально короткий, чтобы избежать работы со всеми другими отслеживаемыми объектами при выполнении этой операции. Для начала:
using(var insertContext = new MyAppContext())
{
foreach (EcgDTO.HrvData data in u.hrvData)
{
if (data.hrv == null && data.hrv.Count == 0)
continue;
foreach (String d in data.hrv)
{
ECG ecg = new ECG
{
Id = id++;
IdPerson = idPatient;
y = Decimal.Parse(d);
timestamp = data.createdDate;
};
insertContext.ECG.Add(ecg);
}
}
int savedData = insertContext.SaveChanges();
}
Вы можете построить объекты ЭКГ, используя Linq, но я не думаю, что это было бы так легко понять. Ключевое предложение здесь состоит не в том, чтобы использовать основной DbContext, а вместо этого выполнять вставки, используя выделенный экземпляр DbContext, который ограничен только этой операцией.
Logi c подобно Id = id++;
вызывает некоторое беспокойство, поскольку для этого потребуется только один экземпляр этой операции для выполнения в любой конкретный момент времени. В идеале присвоение идентификатора для новых строк должно передаваться на уровне БД с использованием столбцов Identity или методов Sequence / generation, где EF настроен для обработки их как столбцов Identity. Таким образом, вам не нужно беспокоиться о нескольких экземплярах, пытающихся вставить одинаковые диапазоны идентификаторов. Например, если для id
установлено что-то вроде SELECT MAX(Id) From ECG
, если два экземпляра начнут эту операцию примерно в одно и то же время, оба экземпляра получат одинаковое значение MAX(Id)
из базы данных и попытаются вставить одинаковые увеличенные идентификаторы. Все, что сохранено первым, будет успешным, в то время как второе вызовет исключения относительно дублирующих ПК.