gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:53 25 4
gpt4 key购买 nike

我使用 MySQL(它不支持 MARS),我尝试并行运行多个 SELECT。连接字符串是相同的,但是对于每个 SELECT 我都创建了另一个数据库上下文。

看起来像这样:

using (var db = DataContextCreator.Instance.Create())
{
return db.Customers
.Where(it => it.customer_Id > 10)
.Detach(db.Customers);
}

关于 Detach 的一句话 -- 它是获取一条记录或一堆记录的辅助方法。在第二种情况下,它列出了它们(使它们成为具体数据),并从数据库上下文中分离记录(因此 GC 可以释放数据库上下文)返回分离的数据。

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

是因为我使用单个连接字符串来创建所有这些数据库上下文吗?或者换句话说——上述情况是否需要 MARS?

我问这个问题是因为我不想重新发明轮子,而且因为我的所有查询都相当小而且速度很快,所以我正在考虑愚蠢的解决方法——在数据库上下文创建器中使用锁。这样每个查询数据库的 block 都会保证不会与另一个 block 并行执行。

最佳答案

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

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

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

我建议使用 AsNoTracking实现目标的扩展方法。

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

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

关于c# - EF 的多个上下文中的多个 SELECT 是否需要 MARS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com