私はしばらく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