.net 4.0 で実行されている Entity Framework を使用して postgresql Web アプリケーションを正常に実行している環境があります。
どういうわけか、私のマシンでのみ、単一の Linq クエリが失敗し、他のマシンでは成功します。以下は linq クエリで、そのコンテキストは特に問題ではありません。ポイントは、私のマシンではなく、他のマシンで動作することです。さらに、私のマシンは挿入などを正常に実行できますが、この特定の実行はできません。
((SEntities)Context).c_app.MergeOption = MergeOption.AppendOnly;
app = (((from rec in ((SEntities) Context).c_application
where rec.app_id == CStatus.app_id
select rec) as ObjectQuery<c_application>)
.Include("c_status")
.Include("c_tasks")
.Include("c_product")
.Include("c_acct")
).SingleOrDefault();
同僚のマシンでは、同じサーバー構成で実行されている新しいチェックアウトにより、成功した結果が得られます。
ただし、私の場合、次の例外があります。
System.Exception {System.Data.EntityCommandExecutionException}
InnerException:
{"エラー: 42601: \"LEFT\"" 付近での構文エラー"} System.Exception {Npgsql.NpgsqlException}
表示されるデバッグウィンドウのerrorSQLエントリを見ると、「select .... limit 2 left join...」という無効な巨大なSQLが作成されており、エラーが発生しています。
問題は、これが自分のマシンでのみ発生し、コンパイルされたコードが他のマシンにデプロイされたり、同僚が作業している同じコードが実行されたりするのはなぜですか? 最近 64 ビット アプリ プールにアップグレードしましたが、DLL はそれと共に展開され、出力からは正しいものです。
明らかに、マシンに何かが欠けていますが、それは私たちのソースにはありません。そのため、問題を引き起こした iis 構成または gac 内の何かのいずれかです。
編集:
確認したにもかかわらず、Visual Studio の開発者プレビュー インストールを行ったときに 4.5 をインストールしていました。4.5 は 4.0 からのインプレース アップグレードであるため、4.5 であるにもかかわらず、「ターゲット 4.0」と記載されているものをすべて見逃していました。どうやら Microsoft は Entity Framework の 4.5 で多数のバグを修正した (またはさらに多くのバグを作成した) ようで、これもその 1 つです。他の人も同様の問題を抱えていたので、4.0 のバグなのか、4.5 で導入されたバグなのかはわかりません。
以下は、何らかの形で持っている可能性のある人のために上記を修正しました
string sql = "SELECT VALUE a FROM c_application AS a WHERE a.app_id = @appId";
ObjectParameter[] queryParams = { new ObjectParameter("appId", CStatus.app_id) };
ObjectQuery<c_application> query = Context.CreateQuery<c_application>(sql, queryParams).Include("c_status").Include("c_tasks").Include("c_product").Include("c_acct");
CApplicationDao cApplicationDao = new CApplicationDao();
SetupDao<c_application>(cApplicationDao);
query.MergeOption = MergeOption.AppendOnly;
app = credApplicationDao.FindSingle(query);