我已经使用 EF 一段时间了,但我从来没有遇到过这个问题。基本上,我们有一个为 Web 前端提供数据的 WCF 服务。在该服务中,我们使用 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 和 orderType 在参数中传递。
正如预期的那样,代码没有任何问题......直到我们运行一些压力测试,我们同时从不同的客户端调用服务(即 GET 函数)。几分钟后,我们得到一堆InvalidOperationException: The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid。在我们的 SQL 2008 数据库中,OrderID 是 int (identity, auto-gen),而 OrderFlag 是唯一数据类型 = bit 的字段(由 EF 转换为布尔值)。
在调试期间,我发现异常是由 query.Any() 或 foreach 子句引发的,当查询中的单个项目被强制转换为 Order 时。但是,如果我以任何方式接触事务(在 SSMS 上运行相同的查询或在 Watch 窗口中执行 query.Any()),查询会使用适当的数据进行更新,并且它可以正常工作....
我们的环境:VS 2010, .Net 框架 4、EF 4、SQL Server 2008 express + 标准(我都尝试过)
任何意见或任何帮助将不胜感激......
Eric