0

我已经使用 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

4

1 回答 1

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();
}

并再次运行您的测试。除了这会解决您的问题之外,我不会,但是您当前的代码不应该通过代码审查。

于 2011-04-30T10:40:06.107 回答