如何使用实体框架.SqlQuery,以便它可以同时由多个客户端使用?



在我的 ASP.NET MVC应用程序中,我有一个方法,该方法具有执行存储过程的循环。要循环访问的项目数可以是 10,000 个或更多。当一个客户端尝试一次运行报表时,这一切都可以正常工作,但是当多个客户端尝试运行报表时,它会锁定所有客户端并出错。创建的错误是:

SqlParameter 已包含在另一个 SqlParameterCollection 中。

错误是在我尝试使用"结果"的行上生成的,然后,端点对所有用户保持锁定状态,直到应用程序重新启动。我以前从未遇到过这个问题,这也是我以前第一次使用实体框架生成大型报表。如何避免此错误?这是代码:

foreach (var item in upcList)
{
try
{
if (!string.IsNullOrEmpty(item[0]))
{
string upc;
if (DropCheckDigit != true)
{
upc = Helpers.upc.formatBRDUpc(item[0]);
}
else
{
upc = Helpers.upc.formatBRDUpcDropCheckDigit(item[0]);
}
var results = BRDataDb.Database.SqlQuery<ProductMovementItem>("EXEC MoC_MoCHub_GetItemData @p0, @p1", upc, DataSource).FirstOrDefault();
if (results != null)
{
if (results.BaseQty != 0 && results.BasePrice != 0)
{
results.Margin = (((results.BasePrice / results.BaseQty) - results.cost) / (results.BasePrice / results.BaseQty)) * 100;
if (results.Margin != null)
{
results.Margin = decimal.Round(decimal.Parse(results.Margin.ToString()), 2);
}
}
PMIList.Add(results);
progressCounter += 1;
Helpers.SharedFunctions.SendProgress("Processing...", progressCounter, (upcList.Count * 2), connectionId);
}
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
}

你试过处理吗

foreach (var item in upcList)
{
try
{
if (!string.IsNullOrEmpty(item[0]))
{
string upc;
if (DropCheckDigit != true)
{
upc = Helpers.upc.formatBRDUpc(item[0]);
}
else
{
upc = Helpers.upc.formatBRDUpcDropCheckDigit(item[0]);
}
using (BRDataDb db = new BRDataDb())
{
var results = db.Database.SqlQuery<ProductMovementItem>("EXEC MoC_MoCHub_GetItemData @p0, @p1", upc, DataSource).FirstOrDefault();
if (results != null)
{
if (results.BaseQty != 0 && results.BasePrice != 0)
{
results.Margin = (((results.BasePrice / results.BaseQty) - results.cost) / (results.BasePrice / results.BaseQty)) * 100;
if (results.Margin != null)
{
results.Margin = decimal.Round(decimal.Parse(results.Margin.ToString()), 2);
}
}
PMIList.Add(results);
progressCounter += 1;
Helpers.SharedFunctions.SendProgress("Processing...", progressCounter, (upcList.Count * 2), connectionId);
}
}
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
}

最新更新