2014-11-30 24 views
7

Uso il database EF5 su SQLite (utilizzando System.Data.SQLite 1.0.90.0). I soggetti sono esposti tramite il servizio ODataEccezione SQLite: "nessuna di tali funzioni: BigCount" quando si utilizza "contare" chiamando il servizio OData con il provider EntityFramework

public sealed class MyService : DataService<MyEntities> 

Quando interrogo i miei soggetti da dentro la mia app funziona bene, per esempio

using (var ents = new MyEntities) 
{ 
    var count = ents.SomeEntity.Select(ent => ent).Count(); 
} 

Quando trasmetto una richiesta dal browser come questo

http://localhost:8737/MyService/SomeEntity 

funziona anche bene, mi restituisce la lista delle mie entità.

Ma quando creo un seguente richiesta

http://localhost:8737/MyService/SomeEntity/$count 

O

interrogo il servizio riferimento al servizio di qualche applicazione client (e la mia interrogazione contiene Count()), ottengo un'eccezione

System.Reflection.TargetInvocationException: l'eccezione di una chiamata è stata lanciata dalla destinazione. ---> System.Data.EntityCommandExecutionException: si è verificato un errore durante l'esecuzione della definizione del comando. Vedi l'eccezione interna per i dettagli. ---> System.Data.SQLite.SQLiteException: errore logico SQL o mancante del database
nessuna tale funzione: BigCount

Suppongo che quando si genera la richiesta di SQL che contiene la funzione aggregata BIGCOUNT che SQLite non lo fa avere. Se cambio il mio provider di database in SQL Server, allora è tutto a posto. Non so cosa posso fare per cambiare il modo in cui viene generata la richiesta. Ho provato a passare a Entity Framework 6 + System.Data.SQLite 1.0.94.0 ma è inutile. Ho provato ad attenermi a EF5 e modificare le versioni di System.Data.SQLite con quelle precedenti, ma nulla è cambiato. L'unica differenza che ho avuto è stata che il mio earlier problem è stato "risolto" (tra virgolette perché non chiamerei qualcosa che non capisco una soluzione) quando ho usato l'EF6 + SQLITE1.0.94.0.

AGGIORNAMENTO 23/12/2014

abbiamo risolto questo problema esaminando le fonti System.Data.SQLite, trovare il posto in cui è stato utilizzato in modo non corretto la parola chiave "bigcount", fissandolo per le nostre esigenze e poi ricostruire il biblioteca.

Come indicato in here, il BigCount deve essere compilato su COUNT() in tutti i database tranne SQL Server. Sembra che BigCount sia stato compilato solo per BigCount, o come quello.

Ricostruire la libreria si è rivelata complicata, e dato che sono ancora un po 'Junior, quindi il mio team leader ha fatto quella parte e non posso dire i dettagli, cosa che non ho avuto il tempo di immergermi più a fondo in. Almeno, è una direzione che è possibile utilizzare per risolvere lo stesso problema.

+1

Ho riscontrato lo stesso problema con un ticket aperto su [system.data.sqlite.org] (http://system.data.sqlite.org/index.html/info/76c2eaadc0297696). Se è possibile fornire ulteriori dettagli su come è stato risolto, questo potrebbe accelerare per farlo includere nella versione ufficiale. – linac

+0

Grazie, @linac. Sfortunatamente, non ho potuto aggiungere commenti a quel ticket, ma ho aggiunto una risposta a questa domanda con istruzioni dettagliate passo-passo per risolvere il problema. –

risposta

1

Ho anche incontrato l'errore SQL logic error or missing database\r\nno such function: BigCount e qui ci sono le istruzioni dettagliate passo-passo che ho usato per aggiornare il codice per risolvere il problema su un sistema operativo Windows:

  1. Scarica fossil ed estrarre fossili.exe alla directory <working>

  2. Aprire un prompt dei comandi normale

  3. Run cd <working>

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

  5. Run fossil open sds.fossil

  6. Run fossil update <release-tag>

    Per esempio, fossil update release-1.0.105.2

  7. Aggiornamento .\System.Data.SQLite.Linq\SQL Generation\SqlGenerator.cs:
    a. linee non commentate 1978 - 1983
    b. sostituire la linea 1982 con la seguente riga:

    aggregateResult.Append("COUNT");

  8. Run cd Setup

  9. Run set_YYYY.bat

    Ad esempio, per costruire i binari net451, gestita set_2013.bat

  10. Run build.bat ReleaseManagedOnly

  11. rimuovere i riferimenti al System.Data.SQLite.Linq e System.Data.SQLite.EF6 dal progetto Web ASP.NET

  12. Aggiungi riferimento per il nuovo System.Data.SQLite.Linq.dll e System.Data.SQLite.EF6.dll dal <working>\bin\2013\Release\bin nel progetto Web ASP.NET

Fonti:

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