Использование DbContext параллельно - PullRequest
0 голосов
/ 18 января 2019

Возможно ли использовать параллелизм в Entity Framework DbContext? В основном у меня есть приложение, которое добавляет тысячи записей для каждой из 4 таблиц, которые у меня есть. И я думаю, что лучший способ оптимизировать его - это добавлять записи параллельно.

public void Transact()
{
    var context = new DbContext();

    _fooList = new List<Foo>
    { 
        //… Assume that this list contains thousands of objects 
    }

    context.Set<Foo>().AddRange(_fooList);

    var context1 = new DbContext();

    _barList = new List<Bar>
    {
        //… Assume that this list contains thousands of objects
    }
    context1.Set<Bar>().AddRange(_barList);

    context.SaveChanges();
    context1.SaveChanges();
}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Это очень возможно и быстрее (при правильном использовании, об этом позже)
А вот как вы могли это сделать:

var context1 = new DbContext();
_fooList = new List<Foo>
{
    // Thousands of datasets
}

context1.Set<Foo>().AddRange(_fooList);

var context2 = new DbContext();
_barList = new List<Bar>
{
    // Thousands of datasets
}

context2.Set<Bar>().AddRange(_barList);

var fooTask = context1.SaveChangesAsync();
var barTask = context2.SaveChangesAsync();

await Task.WhenAll(new Task[] {fooTask, barTask});

Это быстрее, чем запись одного контекста в одну таблицу, а затем в следующую, но если вы делаете это для одной и той же таблицы, это может быть на самом деле медленнее, чем при использовании 1 контекста

0 голосов
/ 18 января 2019

Пожалуйста, посмотрите этот поток StackOverflow: Безопасен ли поток DbContext?

DbContext не является потокобезопасным, но вы можете создать новый для каждого потока.Если вы используете Задачи и тому подобное, обязательно создайте для каждого из них новый DbContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...