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.
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
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. –