2009-09-29 24 views
10

El uso de VS 2008, SQL Server 2008 y WPF 3.5, he hecho algunos cambios a mi esquema y el modelo actualizado. Se compila y funciona muy bien, hasta que la aplicación cliente llama a una entidad específica y consigo los siguientes (los nombres reales sustituidos):lector de datos es incompatible ... miembro no tiene correspondiente en la columna lector de datos

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. 

He buscado a través de la aplicación de los servicios de nombres de entidad y de propiedad relacionados, trató de cambiar el nombre propiedades en el mapa de la tabla, parece ser una cantidad de otras que informan sobre el mismo error, pero parece que no pueden encontrar una respuesta oportuna ....

... ¿Alguien sabe cómo rastrear esto, y si es así, ¿hay una solución o metodología a seguir para evitar en el futuro?

+0

Mi problema era que tenía un retorno de carro (0) antes de mi .... instrucción SELECT. Así que, obviamente, no devolvía las columnas que el EF estaba esperando. –

Respuesta

2

favor verifique this entrada en el blog. Ver el primer comentario de Divan Moller. Podría ser útil para ti.

+0

Gracias Mahin - en este caso, los nombres son idénticos en el caso y en todo. Después del siguiente comentario en ese enlace, tal vez alguien pueda consultar el Capítulo 13 de la Biblia del Entity Framework mencionado: no tengo una copia. – erinql

4

Ok - aquí está el flaco:

Eso particular, la vista se ha configurado como un tipo de retorno para un procedimiento almacenado que tuvo que ser configurado como una importación de función en la entidad contenedora del modelo.

me habían actualizado que el fin de adaptarse a las nuevas exigencias de información, sin darse cuenta de que es un significado a la importación de funciones. Los campos adicionales no son parte del conjunto de datos reconocido para este fin, por lo que no pudo encontrar una coincidencia para ninguno de ellos.

Así que duplica la vista y el sufijo con 'Informe', a continuación, volvieron de nuevo a la original, se espera conjunto de campos de retorno.

Voila!

+0

Tuve un problema similar, luego ver una mención de 'Procedimiento almacenado' me recordó cuál fue la causa. –

12

En lugar de actualizar la vista, también se puede actualizar la importación Función:

  • Ir a la ventana Model Browser
  • Ampliar el EntityContainer
  • Abra la importación de función en la ventana de detalles de asignación
  • Si el nombre de la entidad (columna de la izquierda) no coincide con el nombre del campo esperado (columna de la derecha), puede cambiar la columna de la derecha para que coincida con el campo al que se llama realmente el campo devuelto.
+0

muchas gracias, esto me ayudó. respuesta –

5

Tuve un problema similar que producía el mismo mensaje de error: el problema era que un nombre de columna devuelto por el proceso incluía un espacio.

Al crear el tipo complejo, se creó [my column] como my_column.

Luego al ejecutar el proceso con ExecuteStoreQuery, my_column no existía en el lector de datos, ya que el proceso aún devolvía [my column].

Solución: elimine el espacio de proc nombre de la columna y volver a crear el tipo de complejo para la función importada.

1

se me ocurrió contra el mismo problema cuando se utiliza Sprocs recientemente.Tenía un poco de SQL conditonal en el procedimiento almacenado a lo largo de las líneas de un par de 'si' declaraciones

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

aquí está mi código EF:

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

no había atendidos escenarios donde ninguno 'si' declaraciones devuelto verdadero, por lo que sproc ni siquiera devolvió un conjunto de resultados vacío e hizo que EF arrojara este error. Sin devolver incluso un lector vacío, EF no tenía nada que coincidir al asignar columnas a las propiedades.

Espero que ayude.

+0

Santos trabajó para mí: 'el procedimiento almacenado ni siquiera se devuelve un conjunto de resultados vacío' – beaudetious

+0

Tan cierto Incluso me he enfrentado mismo problema. He considerado todos los casos pero ignoré el caso final que generó este problema. Después de leer esta publicación, he incluido el caso final else y el problema está resuelto. –

2

He visto esto suceder en objetos de datos que varían el conjunto de resultados (por ejemplo, un sproc con una instrucción if) El mensaje de error es Trabajo de marco de entidad/Lector de datos que indica que esperaba la columna x y no se devolvió.

Para solucionar este usted puede a) Asegúrese de que todos los caminos de su sproc devuelven los mismos nombres de columna b) Uso Database.ExecuteSqlCommand

0

manera fácil:

  1. Una vez que se ha completado SP actualice el Modelo EF para que esté disponible.
  2. Agregue la instrucción PRINT a SP, vuelva a compilar y ejecute.
  3. comentario a cabo SQL dinámico y poner en instrucción PRINT, recompilar asegurar que se ejecuta.
  4. Ahora haga la función Importar en EF, se mostrarán las columnas.
  5. Cambio SP volver al código dinámico y todo bien :)
Cuestiones relacionadas