Le type ou le nom d'espace de noms 'Objects' n'existe pas dans l'espace de noms 'System.Data'

102

J'utilise des entités, C # et SQL Server pour créer une application à n niveaux. Je crée des classes de base communes à tous mes composants DAL. Dans cette classe de base, je souhaite gérer l'état de connexion de la classe de base ObjectContext héritée par l'objet entités.

La compilation génère l'erreur suivante:

Le type ou le nom d'espace de noms 'Objects' n'existe pas dans l'espace de noms 'System.Data' (vous manquez une référence d'assembly?)

En outre, l'instruction using System.Data.Objects ne résout pas pour la même raison.

J'ai essayé d'ajouter l'assemblage comme référence, mais je n'ai pas pu le trouver dans l'onglet .NET des références d'assemblage.

Des pensées? Merci!

crayons de couleur
la source

Réponses:

207

Vous devez ajouter une référence à l'assembly .NET System.Data.Entity.dll.

Joshua Belden
la source
1
Ça a marché! Curieux, si l'espace de noms System.Data.objects est bien présent dans System.Data.Entity?
pencilslate
52

Si vous utilisez Entity Framework 6, l'espace de nom a changé. Vous souhaitez utiliser

System.Data.Entity.Core.Objects.ObjectQuery
James
la source
J'ai Entity Framework 6.1.3 installé via le gestionnaire de packages nuget. Je n'ai pas encore référencé l'assembly System.Data.Entity de Microsoft. Ça me donne des erreurs. Ma question est donc la suivante: dois-je faire référence à System.Data.Entity EN PREMIER avant d'ajouter cette instruction using?
vibs2006
31

Mise à niveau d'EF5 vers EF6 nuget il y a quelque temps et continuant à rencontrer ce problème. Je le corrigerais temporairement en mettant à jour le code généré en référence System.Data.Entity.Core.Objects, mais après la génération, il serait à nouveau modifié (comme prévu depuis sa génération).

Cela a résolu le problème pour de bon:

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

Si vous avez des modèles créés avec EF Designer, vous devrez mettre à jour les modèles de génération de code pour générer du code compatible EF6. Remarque: Actuellement, seuls les modèles EF 6.x DbContext Generator sont disponibles pour Visual Studio 2012 et 2013.

  1. Supprimez les modèles de génération de code existants. Ces fichiers seront généralement nommés <edmx_file_name> .tt et <edmx_file_name> .Context.tt et seront imbriqués sous votre fichier edmx dans l'Explorateur de solutions. Vous pouvez sélectionner les modèles dans l'Explorateur de solutions et appuyer sur la Deltouche pour les supprimer.
    Remarque: Dans les projets de site Web, les modèles ne seront pas imbriqués sous votre fichier edmx, mais répertoriés à côté de celui-ci dans l'Explorateur de solutions.
    Remarque: Dans les projets VB.NET, vous devrez activer «Afficher tous les fichiers» pour pouvoir voir les fichiers de modèle imbriqués.
  2. Ajoutez le modèle de génération de code EF 6.x approprié. Ouvrez votre modèle dans EF Designer, cliquez avec le bouton droit sur l'aire de conception et sélectionnez Ajouter un élément de génération de code ...
    • Si vous utilisez l'API DbContext (recommandé), EF 6.x DbContext Generator sera disponible sous l' onglet Données .
      Remarque: si vous utilisez Visual Studio 2012, vous devrez installer les outils EF 6 pour disposer de ce modèle. Voir Obtenir Entity Framework pour plus de détails.
    • Si vous utilisez l'API ObjectContext, vous devrez sélectionner l' onglet En ligne et rechercher EF 6.x EntityObject Generator .
  3. Si vous avez appliqué des personnalisations aux modèles de génération de code, vous devrez les réappliquer aux modèles mis à jour.
Tim Valentine
la source
3

si vous souhaitez utiliser "System.Data.Objects.EntityFunctions"

utiliser "System.Data.Entity.DbFunctions" dans EF 6.1+

sumanth
la source
3

Dans mon cas pour EF 6+, lors de l'utilisation de ceci:

System.Data.Entity.Core.Objects.ObjectQuery

Dans le cadre de cette commande:

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

J'ai eu cette erreur:

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'

J'ai donc fini par devoir utiliser ceci:

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

Bien sûr, votre signature de type anonyme peut être différente.

HTH.

user8128167
la source
0

J'ai ajouté une référence au fichier .dll, pour System.Data.Linq, ce qui précède n'était pas suffisant. Vous pouvez trouver .dll dans les différents répertoires pour les versions suivantes.

System.Data.Linq C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Data.Linq.dll 3.5.0.0

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

Tom Cubbins
la source
2
Correction cela répond à une question où: Le type ou le nom de l'espace de noms 'Linq' n'existe pas dans l'espace de noms 'System.Data'
Tom Cubbins
0

Vous devez ajouter une référence à l'assembly .NET System.Data.Linq

Null29
la source
Salut Null29, pouvez-vous expliquer en quoi votre réponse est meilleure que celles déjà fournies?
Noel Widmer