0

私はしばらくEFを使用していますが、この問題が発生したことはありません。基本的に、Webフロントエンドにデータを提供するWCFサービスがあります。そのサービスでは、データ実装としてEF4を使用します。すべてのリポジトリとシングルトンをバイパスすると、単純な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が発生します。マテリアライズされた「System.Int32」型から「System.Boolean」型への指定されたキャストは無効です。SQL 2008データベースでは、OrderIDはint(identity、auto-gen)であり、OrderFlagはデータ型= bit(EFによってブール値に変換される)を持つ唯一のフィールドです。
デバッグ中に、クエリ内の1つのアイテムがOrderにキャストされたときに、query.Any()またはforeach句によって例外がスローされたことがわかりました。しかし、何らかの方法でトランザクションに触れると(SSMSで同じクエリを実行するか、ウォッチウィンドウでquery.Any()を実行する)、クエリは適切なデータで更新され、正常に機能します
。 .Net Framework 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 に答える