我们有一个环境,它已经成功地运行了一个在 .net 4.0 上运行实体框架的 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:
{"ERROR: 42601: 在\"LEFT\""或附近出现语法错误} System.Exception {Npgsql.NpgsqlException}
如果我查看出现的调试窗口中的 errorSQL 条目,则会使用“select ....limit 2 left join...”创建一个巨大的 SQL,该 SQL 无效并且发生错误的位置。
问题是,为什么这只发生在我的机器上,而我的编译代码部署到其他机器和/或在同事工作时执行的相同代码?我们最近升级到了 64 位应用程序池,但 DLL 是随它一起部署的,并且从输出来看,它们是正确的。
显然我在我的机器上遗漏了一些东西,但它不在我们的源代码中,所以它要么是 iis 配置,要么是 gac 中导致问题的东西。
编辑:
尽管进行了检查,但当我进行 Visual Studio 的开发人员预览安装时,我已经安装了 4.5。由于 4.5 是 4.0 的就地升级,我错过了它说“目标 4.0”的所有内容,尽管它是 4.5。显然,微软在 4.5 中为实体框架(或制造更多)修复了一堆错误,这就是其中之一。其他人也有类似的问题,所以不确定是 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);