并行使用DbContext

时间:2019-01-18 09:41:02

标签: c# 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 :(得分:0)

请参阅以下StackOverflow线程:Is DbContext thread safe?

DbContext不是线程安全的,但是您可以为每个线程实例化一个新线程。如果您使用Tasks等,请确保为每个实例实例化一个新的DbContext。

答案 1 :(得分:0)

这是很有可能的,而且速度更快(如果正确使用,请稍后再介绍)
这是您的方法:

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});

这比将一个Context先写入一个表然后再写入另一个表要快,但是如果您在同一张表上执行此操作实际上可能比使用1个Context进行写要慢