我已经使用了EF一段时间,但我从未遇到过这个问题。基本上我们有一个WCF服务,为Web前端提供数据。在该服务中,我们使用EF 4作为数据实现。绕过所有存储库和单例,一个简单的Get函数如下:
using (OurEntities DataContext = new OurEntities())
{
DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking;
List<Order> orders = new List<Order>();
var query = from p in DataContext.Order.Include("OrderDetail")
where (p.OrderID == orderId || orderId == 0)
&& (p.OrderStatus == orderStatus || orderStatus == 0)
&& (p.OrderType == orderType || orderType == 0)
&& (p.OrderFlag == null || p.OrderFlag == false)
select p;
if (query.Any())
{
foreach (Order order in query)
{
orders.Add(order);
}
}
return orders;
}
orderId,orderStatus&amp; orderType在参数中传递
正如预期的那样,代码可以毫无问题地工作......直到我们运行一些压力测试,我们同时从不同的客户端调用服务(即GET功能)。几分钟后,我们得到一堆 InvalidOperationException:从实体化的'System.Int32'类型到'System.Boolean'类型的指定强制转换无效。在我们的SQL 2008数据库中,OrderID是int(identity,auto-gen),OrderFlag是唯一一个数据类型为bit的字段(由EF翻译为boolean)。
在调试期间,我发现当查询中的单个项目转换为Order时,query.Any()或foreach子句抛出异常。但是,如果我通过任何方式触摸事务(在SSMS上运行相同的查询或在Watch窗口中执行query.Any()),查询将获得适当的数据更新,它只是工作....
我们的环境:VS 2010,.Net框架4,EF 4,SQL Server 2008快递+标准(我试过两个)
任何评论或任何帮助将不胜感激...
埃里克
答案 0 :(得分:3)
您应该首先将代码修改为:
using (OurEntities DataContext = new OurEntities())
{
DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking;
var query = from p in DataContext.Order.Include("OrderDetail")
where (p.OrderID == orderId || orderId == 0)
&& (p.OrderStatus == orderStatus || orderStatus == 0)
&& (p.OrderType == orderType || orderType == 0)
&& (p.OrderFlag == null || p.OrderFlag == false)
select p;
return query.ToList();
}
再次运行测试。我不会这样做会解决您的问题,但您当前的代码不应该通过代码审查。