我在SQLite数据库上使用EF5(使用System.Data.SQLite 1.0.90.0(。实体通过 OData 服务公开
public sealed class MyService : DataService<MyEntities>
当我从应用程序内部查询我的实体时,它可以正常工作,例如
using (var ents = new MyEntities)
{
var count = ents.SomeEntity.Select(ent => ent).Count();
}
当我从这样的浏览器发送请求时
http://localhost:8737/MyService/SomeEntity
它也可以正常工作,它向我返回我的实体列表。
但是当我创建以下请求时
http://localhost:8737/MyService/SomeEntity/$count
或
我从某个客户端应用程序通过服务引用查询服务(我的查询包含Count()
(,我得到一个异常
System.Reflection.TargetInvocationException:调用的目标引发了异常。 ---> System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。---> System.Data.SQLite.SQLiteException:SQL 逻辑错误或缺少数据库
没有这样的功能:BigCount
我想当SQL请求生成时,它包含SQLite没有的聚合函数BIGCOUNT。如果我将我的数据库提供程序更改为 SQL Server,那么一切都很好。我不知道我能做些什么来改变请求的生成方式。我试图切换到实体框架 6 + System.Data.SQLite 1.0.94.0,但没有用。我试图坚持使用EF5并将System.Data.SQLite的版本更改为以前的版本,但没有任何变化。我唯一的区别是,当我使用 EF6+SQLITE1.0.94.0 时,我之前的问题被"解决了"(用引号引起来,因为我不会称我不明白的东西为解决方案(。
更新 23/12/2014
我们通过检查System.Data.SQLite源代码来解决这个问题,找到错误使用"bigcount"关键字的位置,根据我们的需求修复它,然后重建库。
如此处所述,BigCount 应该在除 SQL Server 之外的所有数据库中编译为 COUNT((。看起来BigCount只是为了BigCount编译的,或者类似的东西。
重建图书馆本身就很棘手,而且由于我还只是一名大三学生,所以我的团队负责人做了那部分,我无法说出细节,我没有时间深入研究。至少,这是一个可以用来解决相同问题的方向。
我也遇到了错误SQL logic error or missing databasernno such function: BigCount
以下是我用来更新代码以解决 Windows 操作系统上问题的详细分步说明:
- 下载化石
和提取化石.exe到您的
<working>
目录打开普通命令提示符
运行
cd <working>
运行
fossil clone https://system.data.sqlite.org/ sds.fossil
运行
fossil open sds.fossil
运行
fossil update <release-tag>
例如,
fossil update release-1.0.105.2
更新
.System.Data.SQLite.LinqSQL GenerationSqlGenerator.cs
:
A. 1978-1983
年联合国评论行b. 将第1982行改为:aggregateResult.Append("COUNT");
运行
cd Setup
运行
set_YYYY.bat
例如,若要生成 net451 二进制文件,请运行
set_2013.bat
运行
build.bat ReleaseManagedOnly
从 Web 项目中删除对
System.Data.SQLite.Linq
和System.Data.SQLite.EF6
的引用 ASP.NET在 ASP.NET Web 项目中添加对新
System.Data.SQLite.Linq.dll
的引用,并从<working>bin2013Releasebin
System.Data.SQLite.EF6.dll
来源:
System.Data.SQLite 源代码
System.Data.SQLite 构建过程
System.Data.SQLite Ticket UUID 76c2eaadc0297696b2c5fb10d41a22325f56f9b9