dbcontext.SaveChanges () исключение памяти в больших записях EF - PullRequest
0 голосов
/ 11 июля 2020

Мне не хватает памяти при выполнении метода decontext.savechanges ().

На самом деле мне нужно вставить / обновить 10000+ записей в некоторые таблицы.

ie

//insert table 1 // 10000 record <br>
//insert or update record to table 2 //25000 record<br>
//table 3 1000 record<br>

....
.....
.....

db.context.savechanges(); //Exception happening in this line.

Я получил ошибку «Исключение типа System.OutOfMemoryException».
Я пробовал AutoDetectChangesEnabled, но это не помогло

mydbcontext.Configuration.AutoDetectChangesEnabled = false;
mydbcontext.SaveChanges();

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

«Возникло исключение типа 'System.OutOfMemoryException'» - это обычно происходит со мной, когда я не удаляю свою базу данных. Вероятно, проблема не в количестве записей, которые вы пытаетесь обновить, а, вероятно, потому, что эти записи хранятся в системной памяти.

Решение 1 (рекомендуется) Оберните функции базы данных в Операторы 'using', которые автоматически удаляют контекст вашей базы данных и освобождают память

public void CreateRange(List<MyModel> modelList){
    using(DbContext db = new DbContext())
    {
       db.MyTable.AddRange(modelList); 
       db.SaveChanges();
    }
}

Решение 2 Вызов 'db.Dispose ();' перед окончанием каждого метода

public void CreateRange(List<MyModel> modelList){
    db.MyTable.AddRange(modelList); 
    db.SaveChanges();
    db.Dispose();
}
0 голосов
/ 13 июля 2020
context.BulkInsert(entitiesList);

Для BulkInsert перейдите по ссылке https://github.com/borisdj/EFCore.BulkExtensions

Другой - sqlBulkCopy Самый быстрый способ вставки в Entity Framework

Если вы хотите использовать Savechanges, отличные от l oop, поэтому посмотрите код ниже

try
{
    context.Configuration.AutoDetectChangesEnabled = false;
 
    foreach (var book in bookList)
    {
        context.Books.Add(book);
    }
    
    context.SaveChanges();
}
finally 
{
    context.Configuration.AutoDetectChangesEnabled = true;
}
...