C# EF的多个上下文中的多个SELECT是否需要MARS?

C# EF的多个上下文中的多个SELECT是否需要MARS?,c#,mysql,entity-framework,sql-server-mars,C#,Mysql,Entity Framework,Sql Server Mars,我使用MySQL,它不支持MARS,我尝试并行运行多个选择。连接字符串是相同的,但是对于每个SELECT,我会创建另一个db上下文 看起来是这样的: using (var db = DataContextCreator.Instance.Create()) { return db.Customers .Where(it => it.customer_Id > 10) .Detach(db.Customers); } 关于Detach的

我使用MySQL,它不支持MARS,我尝试并行运行多个选择。连接字符串是相同的,但是对于每个SELECT,我会创建另一个db上下文

看起来是这样的:

using (var db = DataContextCreator.Instance.Create())
{
  return db.Customers
           .Where(it => it.customer_Id > 10)
           .Detach(db.Customers);
}
关于Detach的一个词——它是一种接受一条记录或一堆记录的helper方法。在第二种情况下,它生成它们的列表以使它们成为具体的数据,并将记录从db上下文中分离,以便GC可以释放db上下文并返回分离的数据

现在,它给了我一个关于可怕的错误,已经有一个与此连接相关联的打开的DataReader,必须先关闭它。因为我没有明确使用DataReader,所以我想100%确定原因

是因为我使用单个连接字符串来创建所有这些db上下文吗?换言之,上述场景是否需要火星


我这样问是因为我不想重新发明轮子,因为我所有的查询都非常小和快速,所以我想到了愚蠢的解决方法——在db上下文创建者中使用锁。这样,每个块查询数据库将保证不会与另一个数据库并行执行。

MARS只是在单个SqlConnection对象上同时运行多个查询时的一个因素

通常,每个DbContext对象都有自己的DbConnection对象,因此这可能不是这里的问题

我认为这里的问题是,通过调用Detach方法,您可能正在调用仍在执行的查询

我建议使用扩展方法来实现您的目标

也就是说,我将函数return写为:

return db.Customers.Where(it => it.customer_Id > 10).AsNoTracking().ToList();

MARS只是在单个SqlConnection对象上同时运行多个查询时的一个因素

通常,每个DbContext对象都有自己的DbConnection对象,因此这可能不是这里的问题

我认为这里的问题是,通过调用Detach方法,您可能正在调用仍在执行的查询

我建议使用扩展方法来实现您的目标

也就是说,我将函数return写为:

return db.Customers.Where(it => it.customer_Id > 10).AsNoTracking().ToList();
是因为我使用单个连接字符串来创建所有这些db上下文吗

不,它不可能是单个连接字符串的结果,我假设您的DataContextCreator.Instance.Create返回基于相同连接的上下文。你能提供DataContextCreator代码吗?尤其是属性实例。

是因为我使用单个连接字符串来创建所有这些db上下文吗


不,它不可能是单个连接字符串的结果,我假设您的DataContextCreator.Instance.Create返回基于相同连接的上下文。你能提供DataContextCreator代码吗?特别是属性实例。

000000感谢您的详细解释,因为您揭示了问题所在。我使用多个db上下文,但我反复传递相同的EntityConnection。我现在把它改为只传递字符串连接字符串,同时用db上下文创建实体连接。所以我两者都增加了。在那次改变之后——它成功了!好吧,我还以为你已经这么做了呢。是的,在您的案例中,每次都要创建EntityConnection对象;万分感谢你的解释,因为你揭露了问题。我使用多个db上下文,但我反复传递相同的EntityConnection。我现在把它改为只传递字符串连接字符串,同时用db上下文创建实体连接。所以我两者都增加了。在那次改变之后——它成功了!好吧,我还以为你已经这么做了呢。是的,在您的案例中,每次都要创建EntityConnection对象;谢谢你,Jean快了一点,所以我已经解决了这个问题。事实上,它是在db context creator中创建的—它创建了多个db上下文,但使用了一个实体连接。谢谢,Jean的速度快了一点,所以我已经解决了这个问题。事实上,它位于db上下文创建者内部——它创建了多个db上下文,但使用一个实体连接。