SQLite异常:"没有这样的功能:BigCount"当使用" count"使用EntityFramework提供程序调用OData服务

时间:2014-11-30 17:34:24

标签: c# entity-framework wcf sqlite odata

我在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

OR

我通过某个客户端应用程序的服务引用查询服务(我的查询包含Count()),我得到一个例外

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; System.Data.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---&GT; System.Data.SQLite.SQLiteException:SQL逻辑错误或缺少数据库
      没有这样的功能:BigCount

我认为在生成SQL请求时,它包含SQLite没有的聚合函数BIGCOUNT。如果我将我的数据库提供程序更改为SQL Server,那么一切都很好。我不知道如何改变请求的生成方式。我试图切换到Entity Framework 6 + System.Data.SQLite 1.0.94.0但它没用。我试图坚持EF5并将System.Data.SQLite的版本更改为以前的版本,但没有任何改变。我唯一的区别是当我使用EF6 + SQLITE1.0.94.0时,我的earlier problem被“解决了”(在引号中因为我不会称之为我不理解的解决方案)。

更新2014年12月23日

我们通过检查System.Data.SQLite源,找到“bigcount”关键字被错误使用的位置,根据我们的需要修复它,然后重建库来解决这个问题。

如前所述,here BigCount应该在除SQL Server之外的所有数据库中编译为COUNT()。看起来BigCount只是编译为BigCount,或者像那样。

重建图书馆本身就变得很棘手了,因为我还只是一个小小的,所以我的团队负责人做了那个部分,我不知道细节,我没有时间深入研究至少,这是你可以用来解决同样问题的方向。

1 个答案:

答案 0 :(得分:1)

我还遇到了错误SQL logic error or missing database\r\nno such function: BigCount,这里是我用来更新代码以解决Windows操作系统问题的详细分步说明:

  1. 下载fossil并将fossil.exe解压缩到您的<working>目录

  2. 打开正常的命令提示符

  3. 运行cd <working>

  4. 运行fossil clone https://system.data.sqlite.org/ sds.fossil

  5. 运行fossil open sds.fossil

  6. 运行fossil update <release-tag>

    例如,fossil update release-1.0.105.2

  7. 更新.\System.Data.SQLite.Linq\SQL Generation\SqlGenerator.cs
    一个。不引用评论的话 - 1978 - 1983年 湾用以下行替换1982行:

    aggregateResult.Append("COUNT");

  8. 运行cd Setup

  9. 运行set_YYYY.bat

    例如,要构建net451二进制文件,请运行set_2013.bat

  10. 运行build.bat ReleaseManagedOnly

  11. 从ASP.NET Web项目中删除对System.Data.SQLite.LinqSystem.Data.SQLite.EF6的引用

  12. 在ASP.NET Web项目的System.Data.SQLite.Linq.dll中添加对新System.Data.SQLite.EF6.dll<working>\bin\2013\Release\bin的引用

  13. 来源:

    System.Data.SQLite Source Code
    System.Data.SQLite Build Procedures
    System.Data.SQLite Ticket UUID 76c2eaadc0297696b2c5fb10d41a22325f56f9b9