C# 如何在不同的线程中使用实体框架?

C# 如何在不同的线程中使用实体框架?,c#,database,multithreading,entity-framework,C#,Database,Multithreading,Entity Framework,我有一个实体框架dbContext和方法,可以对数据库进行一些操作。如何从多个线程正确调用它以避免死锁、连接错误等?我尝试了不同的方法,我有很多例外 public void Foo(Bar bar) { using (var db = new ApplicationDbContext()) { db.Documents.Add(bar); ... db.SaveChanges(); } } static void Main

我有一个实体框架
dbContext
和方法,可以对数据库进行一些操作。如何从多个线程正确调用它以避免死锁、连接错误等?我尝试了不同的方法,我有很多例外

public void Foo(Bar bar)
{
    using (var db = new ApplicationDbContext())
    {
        db.Documents.Add(bar);
        ...
        db.SaveChanges();
    }
}

static void Main(string[] args)
{
    ...
    var t1 = new Thread(()=>Foo(bar1));
    thread.Start();

    var t2 = new Thread(()=>Foo(bar2));
    thread.Start();
    ...
}

我以前从未用过线。感谢您的帮助。

创建单个数据库上下文,并与不同的线程共享它,并在数据库中插入/更新/删除记录时锁定它

您可以使用类似Factory的设计模式来创建DBContext的单个实例


如果您尝试此解决方案但失败,让我们检查一下您的代码,也许您在解决方案的实现中遗漏了一些东西。

DbContext不是线程安全的,最好的方法是为每个工作单元(在您的情况下为每个线程)创建单独的DbContext实例。请参阅。

我确实这样做了,但我的连接有问题。我读到,最好每次都创建dbContext。您会遇到异常,因为标识列和类似主题的内容应由数据库服务器处理,当您开始在不同线程中添加/编辑或删除数据库中的记录时,处理并发请求的过程会产生不常见的问题。通过在每个线程中创建数据库上下文,可以打开不同的数据库连接,这些连接独立工作,并且不知道其他线程中数据库上下文的状态。想象一个线程删除记录437,另一个线程尝试更新它!获得许多异常和异常问题是正常的行为。未处理的异常:System.InvalidOperationException:此命令分配了一个打开的DataReader,您必须首先关闭它。我不知道如何处理这个问题。请先检查下面的主题,也许你的问题不是关于多线程:伙计,这真的很有帮助。爱你!