C# 如何正确地处理DbContext以不锁定表/整个数据库?

C# 如何正确地处理DbContext以不锁定表/整个数据库?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我目前正在尝试使用EF完成批量插入/更新,因为我有大量传入的数据需要保存到数据库中。每执行1000个insert或update命令,我就会处理上下文,以保持跟踪的实体数较低 我通过在SaveChanges()之后立即调用工作单元的dispose方法来实现这一点: 然后实例化一个新的上下文,并将其交给工作单元使用 该过程每60秒重复一次,到目前为止,它似乎工作正常,但有时我可以看到SQL server被卡在60秒周期之间。在插入之前使用一个获取当前数据库中所有数据的查询,以确定是否只需要更新某些实

我目前正在尝试使用EF完成批量插入/更新,因为我有大量传入的数据需要保存到数据库中。每执行1000个insert或update命令,我就会处理上下文,以保持跟踪的实体数较低

我通过在
SaveChanges()
之后立即调用工作单元的dispose方法来实现这一点:

然后实例化一个新的上下文,并将其交给工作单元使用

该过程每60秒重复一次,到目前为止,它似乎工作正常,但有时我可以看到SQL server被卡在60秒周期之间。在插入之前使用一个获取当前数据库中所有数据的查询,以确定是否只需要更新某些实体。(因此,我只更新数据库中已有的实体)

这个EF Select语句将挂起30-40秒(直到我猜锁被移除),然后在1秒内激发并完成。(我在ManagementStudio中单独测试了该查询,它一点也没有变慢)

我不知道为什么会发生这种延迟/锁定。除了调用
Context.Dispose()
以帮助SQL server脱离困境之外,是否还需要执行其他操作?还是调用
SaveChanges()
的标准行为


p、 当这个使用join的select查询挂起时,像select*from MATCHS table和select*from bets table这样的简单查询在MANAGEMENTSTUDIO中工作得很好。

您不必处理上下文。只需Google实体框架批量插入…看这里:或者George Vovos,我想把它作为最后的手段。你认为处理上下文会导致我的问题吗?请查看发布的第一个链接@cSteusloff。现在,对于读取,Include可以减慢速度。看看是否可以避免它,如果不可以,请尝试编写联接查询。另外,如果不想更新数据,请使用AsNoTracking(),问题不在于Include。查询速度并不慢。EF只是在代码中调用查询60-70秒后启动查询
public void Dispose()
{
    context.Dispose();
    context = null;
}
var _allMatchDbEntries = matchRepository.GetAll()
                                .Include(x => x.Bets)
                                        .ToList();