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,您必须首先关闭它。我不知道如何处理这个问题。请先检查下面的主题,也许你的问题不是关于多线程:伙计,这真的很有帮助。爱你!