El tipo o nombre del espacio de nombres 'Objetos' no existe en el espacio de nombres 'System.Data'

102

Estoy usando entidades, C # y SQL Server para crear una aplicación de n niveles. Estoy creando algunas clases base comunes a todos mis componentes DAL. En esta clase base, quiero manejar el estado de conexión de la clase base ObjectContext heredada por el objeto de las entidades.

La compilación arroja el siguiente error:

El tipo o nombre del espacio de nombres 'Objetos' no existe en el espacio de nombres 'System.Data' (¿le falta una referencia de ensamblado?)

Además, la declaración using System.Data.Objects no se resuelve por la misma razón.

Intenté agregar el ensamblado como referencia, pero no pude encontrarlo en la pestaña .NET de referencias de ensamblaje.

¿Alguna idea? ¡Gracias!

lapiz pizarra
fuente

Respuestas:

207

Debe agregar una referencia al ensamblado de .NET System.Data.Entity.dll.

Joshua Belden
fuente
1
¡Funcionó! Curioso, si el espacio de nombres System.Data.objects está realmente presente dentro de System.Data.Entity?
pencilslate
52

Si está utilizando Entity Framework 6, el espacio de nombres ha cambiado. Quieres usar

System.Data.Entity.Core.Objects.ObjectQuery
James
fuente
Tengo Entity Framework 6.1.3 instalado a través del administrador de paquetes nuget. AÚN no he hecho referencia al ensamblaje System.Data.Entity de Microsoft. Me está dando errores. Entonces, mi pregunta es ¿necesito hacer referencia a System.Data.Entity PRIMERO antes de agregar esa declaración de uso?
vibs2006
31

Se actualizó de EF5 a EF6 hace un tiempo y seguí encontrando este problema. Lo arreglaría temporalmente actualizando el código generado para hacer referencia System.Data.Entity.Core.Objects, pero después de la generación se volvería a cambiar (como se esperaba desde que se generó).

Esto resolvió el problema para siempre:

http://msdn.microsoft.com/en-us/data/upgradeef6

Si tiene algún modelo creado con EF Designer, deberá actualizar las plantillas de generación de código para generar código compatible con EF6. Nota: Actualmente solo hay plantillas EF 6.x DbContext Generator disponibles para Visual Studio 2012 y 2013.

  1. Elimina las plantillas de generación de código existentes. Por lo general, estos archivos se denominarán <nombre_archivo_edmx> .tt y <nombre_archivo_edmx> .Context.tt y estarán anidados en su archivo edmx en el Explorador de soluciones. Puede seleccionar las plantillas en el Explorador de soluciones y presionar la Deltecla para eliminarlas.
    Nota: En los proyectos de sitios web, las plantillas no se anidarán en su archivo edmx, sino que se enumerarán junto a él en el Explorador de soluciones.
    Nota: En los proyectos de VB.NET, deberá habilitar 'Mostrar todos los archivos' para poder ver los archivos de plantilla anidados.
  2. Agregue la plantilla de generación de código EF 6.x adecuada. Abra su modelo en EF Designer, haga clic con el botón derecho en la superficie de diseño y seleccione Agregar elemento de generación de código ...
    • Si está utilizando la API DbContext (recomendado), EF 6.x DbContext Generator estará disponible en la pestaña Datos .
      Nota: Si está utilizando Visual Studio 2012, deberá instalar EF 6 Tools para tener esta plantilla. Consulte Obtener Entity Framework para obtener más detalles.
    • Si está utilizando la API ObjectContext, deberá seleccionar la pestaña En línea y buscar EF 6.x EntityObject Generator .
  3. Si aplicó alguna personalización a las plantillas de generación de código, deberá volver a aplicarlas a las plantillas actualizadas.
Tim Valentine
fuente
3

si desea utilizar "System.Data.Objects.EntityFunctions"

use "System.Data.Entity.DbFunctions" en EF 6.1+

sumanth
fuente
3

En mi caso para EF 6+, al usar esto:

System.Data.Entity.Core.Objects.ObjectQuery

Como parte de este comando:

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query).ToTraceString();

Tengo este error:

Cannot cast 'query' (which has an actual type of 'System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>') to 'System.Data.Entity.Core.Objects.ObjectQuery'

Así que terminé teniendo que usar esto:

var sql = ((System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>)query).ToString();    

Por supuesto, su firma de tipo anónima puede ser diferente.

HTH.

user8128167
fuente
0

Agregué una referencia al archivo .dll, para System.Data.Linq, lo anterior no fue suficiente. Puede encontrar .dll en los distintos directorios de las siguientes versiones.

System.Data.Linq C: \ Archivos de programa (x86) \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Data.Linq.dll 3.5.0.0

System.Data.Linq C: \ Archivos de programa (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ System.Data.Linq.dll 4.0.0.0

Tom Cubbins
fuente
2
Corrección: esto responde a una pregunta donde: El tipo o nombre del espacio de nombres 'Linq' no existe en el espacio de nombres 'System.Data'
Tom Cubbins
0

Necesita agregar una referencia al ensamblado .NET System.Data.Linq

Nulo29
fuente
Hola Null29, ¿puedes explicar cómo tu respuesta es mejor que las que ya se proporcionaron?
Noel Widmer