web-dev-qa-db-fra.com

EF 4.1 Code Première erreur - Le type d'entité SomeType ne fait pas partie du modèle pour le contexte actuel

En travaillant d'abord avec le code EF, l'erreur ci-dessous est générée à différents moments:

Le type d'entité SomeType ne fait pas partie du modèle pour le contexte actuel.

Quelles sont les causes possibles de cette erreur?

42
rovsen

Cela peut se produire parce que: 

  • DbContext configuré avec une chaîne de connexion incorrecte 
  • L'entité spécifiée n'est en réalité pas mappée dans la configuration
40
rovsen

Je l'ai compris lorsque ma classe héritée de DbContext n'a pas déclaré le modèle comme une propriété. Par exemple, j'ai négligé d'ajouter une propriété pour FooModel dans le code ci-dessous:

public class MyDBContext : DbContext
{
    public DbSet<FooModel> FooModels{ get; set; }

    // etc. ... 
}
14
GraehamF

Ce message apparaît également si vous essayez de créer un tel EntityState sur une collection enfant dans une association un-à-plusieurs. 

Par exemple; si une association un-à-plusieurs existe entre ParentEnt et ChildEnt dans l'extrait de code ci-dessous, le message d'erreur suivant:

Le type d'entité Hash1Type ne fait pas partie du modèle pour le contexte actuel.

MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;

La modification suivante ne génère pas d'erreur:

MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged;

Notez que l'utilisation de First() dans ce cas peut indiquer t

5
Doug Kimzey

Cela peut arriver lorsque votre modèle n'est pas correctement mappé sur votre classe. Dans mon cas, j'ai eu cette erreur lorsque j'ai utilisé EF Model First et lorsque j'ai mis à jour mon modèle EDMX à partir de DB mais que je n'ai pas mis à jour ma classe Entity. Plus précisément, une propriété dans Entity était en minuscule, tandis que dans un diagramme DB et EDMX, elle était en majuscule. Un autre problème que j’avais était une propriété modèle dans le diagramme EDMX qui n’était pas convertie en mon application Enum afin que EF ne puisse pas reconnaître cette entité.

1
Amir Chatrbahr

Cela peut également être dû à des propriétés de votre POCO non nommées EXACTEMENT, comme elles le sont dans EDMX/modelbuilder. S'il vous plaît voir mon post ici pour plus de détails sur la façon dont j'ai résolu le problème.

Le type d'entité <classe> ne fait pas partie du modèle pour le contexte actuel

1
Aaron Bar

J'ai eu cette erreur.

Il s'est avéré que j'avais ajouté un nouveau champ à une db View quelques heures auparavant. J'ai mis à jour le contexte (dans le cadre d'une autre chose que je faisais) et j'ai eu cette erreur.

Lorsque j'ai mis à jour le POCO, tout allait bien: EF a lancé cette erreur car il ne pouvait pas mapper un champ de la vue sur une propriété du poco de la vue. 

Ce n'est pas le message d'erreur le plus utile dans cette situation, OMI.

1
Neil Thompson

Dans mon scénario, j'utilisais EF6 pour migrer une base de données MySQL vers MSSQL. J'avais 2 modèles et contextes distincts, chacun avec sa propre chaîne de connexion. Les classes avaient le même nom, mais celles de MySQL étaient toutes en minuscules et celles de MSSQL one Pascal. J'avais copié dans les deux chaînes de connexion les assemblys pertinents contenant mes modèles EDMX. Mais lorsque j'ai exécuté mon application, une erreur s'est produite au sujet de l'une des 2 chaînes de connexion ayant déjà été ajoutée à la liste des dictionnaires.

J'ai donc supprimé l'entrée en conflit, en pensant stupidement qu'elle avait accès à la chaîne de connexion dans le fichier app.config de l'Assemblée (il est tard!). Mais non, l’erreur se produisait réellement car les deux chaînes de connexion portaient également le même nom - une lettre minuscule et une autre en mode Pascal - c’est-à-dire que la clé Dictionary ignorait le style. Ainsi, lorsque j'ai supprimé MySQL, il a ensuite tenté d'utiliser la chaîne de connexion MSSQL pour les deux modèles. Je devais donc rajouter, renommer et définir manuellement la chaîne de connexion du deuxième modèle en code.

0
Breeno

METTRE &AGRAVE; JOUR

Cette erreur continuait de m'attaquer avec diverses mises à jour apportées à la base de données. Finalement, j'ai supprimé le fichier edmx et je l'ai simplement créé à nouveau avec les mêmes tables et les mêmes procs.

Vieux

J'ai eu ceci quand l'entité générée manquait une colonne nullable:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace MyProgram.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Question
    {
        public int id { get; set; }
        public string title { get; set; }
        public string body { get; set; }
        public string tags { get; set; }
        public int votes { get; set; }//I had to manually add this property which is nullable int in the database
    }
}

J'ai ajouté la propriété après avoir généré le modèle initial. Cependant, j'ai même essayé de supprimer la table et de la recréer. Cela n'a pas résolu le problème. En ajoutant uniquement la propriété manuellement, je l'ai corrigée.

0
P.Brian.Mackey

J'ai d'abord utilisé la base de données et utilisé la génération de modèles intégrée pour mes modèles (EF 4.1)

J'ai copié le code généré dans un nouveau fichier et supprimé les propriétés de navigation. C'est à ce moment que j'ai commencé à voir cette erreur. Le chargement paresseux est désactivé, mais il semble que les propriétés de navigation sont toujours nécessaires dans les POCO.

Je suppose que l'erreur pourrait indiquer qu'il manque quelque chose à votre modèle.

namespace TestApp.BLL
{
    using System;
    using System.Collections.Generic;

    public partial class User
    {
        public User()
        {
            //this.Roles = new HashSet<Role>();
        }

        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

        //public virtual ICollection<Role> Roles { get; set; }
    }
}

Le code ci-dessus montre les propriétés de navigation commentées. Si je les commente sur tous les POCO (cela signifie aussi le rôle POCO), l'exception disparaît.

0
mbursill

La réponse à la question est "Quelles sont les causes possibles de cette erreur?":

Cette erreur semble se produire chaque fois que le modèle interne/EDMX n’est pas construit correctement ou n’est pas complètement construit. Et il existe un grand nombre de causes potentielles à ce problème. Il est regrettable que le rapport d’erreur ou la détection d’erreur soit insuffisant lors de la construction du modèle. La résolution du problème semble donc impliquer d’essayer un tas de choses pour voir ce qui résout le problème.

J'ai rencontré une autre instance de cette erreur au cours des derniers jours, en utilisant EF 6.0 (code préliminaire), le code en premier et les conventions personnalisées. Il se trouve que la cause première est que j'avais une convention personnalisée qui renomme l'ID EdmProperty (par exemple ID -> MyTypeId). Si je désactivais ma convention personnalisée, ce problème disparaissait. si j'ai activé ma convention, le problème se pose. Il n'y a pas de journalisation, ni d'exception ni d'autre erreur indiquant qu'un problème est survenu lors de la génération du modèle. Cette exception ne fait pas surface jusqu'à ce que j'essaie d'ajouter une entité à un DbSet. La convention n'a posé aucun problème lors de la génération de la base de données (via Migrations).

0
crimbo