2009-09-29 9 views
10

Utilizzando VS 2008, SQL Server 2008 e WPF 3.5, ho apportato alcune modifiche allo schema e aggiornato il modello. Si compila e funziona bene, fino a quando l'applicazione client chiama per un ente specifico e ottengo il seguente (i nomi effettivi sostituiti):Il lettore di dati non è compatibile ... il membro non ha la colonna corrispondente nel lettore di dati

The data reader is incompatible with the specified '<Model>.<ViewBasedEntity>'. A member of the type, '<Property>', does not have a corresponding column in the data reader with the same name. 

Ho cercato attraverso l'applicazione dei servizi per correlati nomi di entità e proprietà, ha provato rinominando proprietà nella tabella Mappa, sembra essere un numero di altri là fuori riportando lo stesso errore, ma non riesco a trovare una risposta tempestiva ....

... Qualcuno sa come rintracciare questo, e se sì, c'è una soluzione o una metodologia da seguire per evitare in futuro?

+0

Il mio problema era che avevo una RETURN (0) prima la mia dichiarazione .... SELECT. Quindi ovviamente non stava restituendo le colonne che l'EF si aspettava. –

risposta

2

Controllare il post del blog this. Controlla il primo commento di Divan Moller. Potrebbe esserti utile.

+0

Grazie Mahin - in questo caso, i nomi sono identici nel caso e tutto. Seguendo il prossimo commento su questo link, forse qualcuno può consultare il capitolo 13 della Entity Framework Bible menzionata - Non ho una copia. – erinql

4

Ok - qui è il magro:

Quel particolare vista era impostato come un tipo di ritorno per una stored procedure che doveva essere configurato come un Import funzione in del modello Entity Container.

Avevo aggiornato quella vista per adattarla ai nuovi requisiti di reporting, non rendendomi conto dell'importanza dell'importazione di funzione. I campi aggiuntivi non fanno parte del set di dati riconosciuto per questo scopo, quindi non è stato possibile trovare una corrispondenza per nessuno di essi.

Quindi ho duplicato la vista e l'ho suffissa con "Report", quindi ho ripristinato l'originale nel suo insieme previsto di campi di restituzione.

Voilà!

+0

Ho avuto un problema simile, quindi vedere una menzione di "Stored Procedure" mi ha ricordato quale fosse la causa. –

12

Invece di aggiornare la vista, è possibile anche aggiornare l'importazione Funzione:

  • Vai alla finestra Modello Browser
  • Espandere l'EntityContainer
  • Aprire l'Import funzione nella finestra Mapping Dettagli
  • Se il nome dell'entità (colonna di sinistra) non corrisponde al nome del campo previsto (colonna di destra), è possibile modificare la colonna di destra in modo che corrisponda a ciò che viene effettivamente chiamato il campo restituito.
+0

grazie mille, questo mi ha aiutato. –

5

Ho avuto un problema simile che ha prodotto lo stesso messaggio di errore - il problema era che un nome di colonna restituito dal proc includeva uno spazio.

Durante la creazione del tipo complesso, [my column] è stato creato come my_column.

Poi, quando l'esecuzione del proc con ExecuteStoreQuery, my_column non esistevano nel lettore di dati, come il proc ancora restituito [my column].

Soluzione: rimuovere lo spazio dal nome della colonna proc e ricreare il tipo complesso per la funzione importata.

1

Mi sono imbattuto lo stesso problema quando si utilizza Sproc di recente.Ho avuto qualche SQL Conditonal nel sproc lungo le linee di un paio di 'se' le dichiarazioni

IF @param1 = 'knownValue' 
BEGIN 
SELECT * FROM EntityType WHERE ID = 'somevalue' 
END 
ELSE IF @param1 = 'knownValue2' 
BEGIN 
SELECT * FROM EntityType WHERE ID = 'somevalue' 
END 

ecco il mio codice di EF:

return context.Database.SqlQuery<EntityType>(
      "[NAV].[GeEntityType] @Date, @ID", 
      new SqlParameter("Date", paramDate), 
      new SqlParameter("ID", paramId)).ToList(); 

non avevo soddisfatti scenari in cui né i 'se' dichiarazioni è ritornato true, quindi lo sproc non ha nemmeno restituito un set di risultati vuoto e ha causato a EF di lanciare questo errore. Senza restituire nemmeno un lettore vuoto, EF non aveva nulla a cui corrispondere durante il mapping delle colonne alle proprietà.

Spero che aiuti.

+0

La risposta di santos ha funzionato per me: "lo sproc non ha nemmeno restituito un set di risultati vuoto" – beaudetious

+0

Così vero Anche io ho affrontato lo stesso problema. Ho preso in considerazione tutti i casi ma ho ignorato l'ultimo caso che ha sollevato questo problema. Dopo aver letto questo post, ho incluso l'ultimo caso e il problema è risolto. –

2

Ive ha visto accadere su oggetti dati che variano il set di risultati (ad esempio un sproc con un'istruzione if) Il messaggio di errore è Lavoro frame/Data lettore che ti dice che è previsto x colonna e non è stato restituito.

Per ovviare a questo è possibile sia a) Assicurarsi che tutte le strade della vostra sProc restituiscono gli stessi nomi di colonna b) uso Database.ExecuteSqlCommand

0

Easy Way:

  1. volta SP è completo aggiornare il modello EF in modo che sia disponibile.
  2. Aggiungi l'istruzione PRINT a SP, ricompila ed esegui.
  3. Commentare SQL dinamico e inserire l'istruzione PRINT, ricompilare assicurarsi che venga eseguito.
  4. Ora fai Importazione funzione in EF, le colonne mostreranno.
  5. Change SP di nuovo a codice dinamico e bene :)
Problemi correlati