2010-10-11 8 views
6

Il mio progetto (livello UI è asp.mvc) è stato sviluppato utilizzando .NET 3.5. Dopo l'aggiornamento a .NET 4.0 ho avuto problemi con le query compilate:DataContext problema di query compilato con .NET 4

[ArgumentException: Query was compiled for a different mapping source than the one associated with the specified DataContext.] 
    System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args) +863348 
    System.Data.Linq.CompiledQuery.Invoke(TArg0 arg0, TArg1 arg1) +110 

Ogni volta quando corro la mia domanda sto passando mio contesto

return StaticQueries.getTopFiveOrders(mContext, int howMany); 


public static Func<Mycontext, int, IQueryable<Order>> getTopFiveOrders 
      = CompiledQuery.Compile 
       ((Mycontext mContext, int howMany) => 
       (some query).Distinct()); 

L'errore si verifica sulla seconda richiesta.

risposta

4

Ciò è dovuto a un cambiamento nel modo in cui operano le query compilate.

Ora devono essere sempre eseguiti utilizzando lo stesso contesto.

This Microsoft connect page spiega perché il cambiamento è stato fatto:

Il problema in questo caso è causato dal fatto che CompiledQuery richiede la stessa fonte mappatura da utilizzare per tutte le esecuzioni. Nell'esempio di codice che si utilizza per riprodurre il problema, le diverse istanze di DataContext utilizzano ogni volta una nuova origine di mapping, ma la query non riesce a segnalarlo e fallisce semplicemente in modo silenzioso. Se si utilizza la proprietà DataContext.Log o altra registrazione come SQL Server Profiler, si noterà che il secondo UPDATE non viene nemmeno inviato al server.

Questo è stato risolto in .NET Framework 4.0 in modo che venga riportata un'eccezione che conterrà un messaggio come "Query è stata compilata per un'origine di mappatura diversa da quella associata al DataContext specificato.", E non lo farà semplicemente fallire. Tuttavia, il codice fornito dall'utente funziona correttamente, poiché utilizza la stessa origine di mapping statico per tutte le istanze di LinqTestDataContext.

Fondamentalmente si era sempre un problema, ma usato a fallire in silenzio, hanno appena fatto il fallimento esplicito nel .NET 4.

0

ho anche affrontato il problema simile. Ho rimosso la statica dalle query compilate, funziona perfettamente. Anche se devo ancora scoprire la differenza che ha sulle prestazioni.

1

Ho trascorso una buona quantità di tempo a guardare questo e come il comportamento è stato modificato in .NET 4.0. Ho esposto dettagliatamente le mie scoperte più a fondo nel mio blog qui:

http://www.roushtech.net/2014/01/19/statically-compiled-linq-queries-broken-in-net-4-0/

La ruvida di esso è: Microsoft ha fatto un cambiamento per proteggere le persone dal fare qualcosa di stupido (Riusare una query compilato tra le diverse mappature), ma sembra aver rotto un importante vantaggio prestazionale (riutilizzando una query compilata tra diversi contesti dello STESSO MAPPING, ma diverse istanze della mappatura).

L'utilizzo di getter o di una CompiledQuery membro della classe comporterà una ricompilazione costante e nessun vantaggio reale in termini di prestazioni.

Problemi correlati