是否可以在实体框架的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();
}
答案 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进行写要慢