web-dev-qa-db-fra.com

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

J'entre dans Entity Framework, mais je ne suis pas sûr s'il me manque un point critique dans l'approche code-first.

J'utilise un modèle de dépôt générique basé sur le code de https://genericunitofworkandrepositories.codeplex.com/ et j'ai créé mes entités.

Mais lorsque j'essaie d'accéder ou de modifier l'entité, je rencontre les problèmes suivants:

System.InvalidOperationException: le type d'entité Estate ne fait pas partie du modèle pour le contexte actuel.

Cela se produit lorsque j'essaie d'y accéder depuis mon référentiel:

public virtual void Insert(TEntity entity)
{
    ((IObjectState)entity).ObjectState = ObjectState.Added;
    _dbSet.Attach(entity); // <-- The error occurs here
    _context.SyncObjectState(entity);
}

La base de données (./SQLEXPRESS) est bien créée, mais les entités (tables) ne sont tout simplement pas créées au démarrage. 

Je me demande si j'ai besoin de définir explicitement le mappage des entités? EF n’est-il pas en mesure de le faire lui-même? 

Mon entité est:

public class Estate : EntityBase
{
    public int EstateId { get; set; }
    public string Name { get; set; }
} 

Mon contexte est comme tel:

public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
    public DimensionWebDbContext() :
        base("DimensionWebContext")
    {
        Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
        Configuration.ProxyCreationEnabled = false;
    }

    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }

}

Y a-t-il une raison spécifique pour laquelle cette erreur se produit? J'ai essayé d'activer les migrations et d'activer les migrations automatiques sans aucune aide.

112
janhartmann

Mettez ceci dans votre classe DbContext personnalisée:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

Si vos tables ne sont pas créées au démarrage, voici pourquoi. Vous devez en informer le contexte DbContext dans la substitution de méthode OnModelCreating. 

Vous pouvez faire ici des mappages personnalisés par entité ou les séparer en classes EntityTypeConfiguration<T> distinctes.

115
danludwig

Apparemment, cette erreur est très générique, elle pourrait avoir plusieurs raisons. Dans mon cas, c'était la suivante: La chaîne de connexion (dans Web.config) générée par le .edmx n'était pas valide. Après presque une journée d'essais, j'ai changé la chaîne de connexion de la chaîne EF en chaîne ADO.NET. Cela a résolu mon problème.

Par exemple, la chaîne EF ressemble à ceci:

<connectionStrings> 
  <add name="BlogContext"  
    connectionString="metadata=res://*/BloggingModel.csdl| 
                               res://*/BloggingModel.ssdl| 
                               res://*/BloggingModel.msl; 
                               provider=System.Data.SqlClient 
                               provider connection string= 
                               &quot;data source=(localdb)\v11.0; 
                               initial catalog=Blogging;
                               integrated security=True; 
                               multipleactiveresultsets=True;&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings>

Et la chaîne ADO.NET ressemble à ceci:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;
        Integrated Security=True;"/> 
</connectionStrings>

Source: http://msdn.Microsoft.com/nl-nl/data/jj556606.aspx

60
Christiaan Maks

Pour moi, le problème était que je n'avais pas inclus la classe d'entité dans mon jeu de bases de données à l'intérieur du contexte pour le cadre d'entité.

public DbSet<ModelName> ModelName { get; set; }
10
Demodave

Le problème peut être dans la chaîne de connexion. Assurez-vous que votre chaîne de connexion correspond au fournisseur SqlClient, sans métadonnées associées à EntityFramework.

7
Shawn de Wet

Vous pouvez essayer de supprimer la table du modèle et de l'ajouter à nouveau. Vous pouvez le faire visuellement en ouvrant le fichier .edmx à partir de l'explorateur de solutions. 

Pas:

  1. Double-cliquez sur le fichier .edmx dans l'Explorateur de solutions.
  2. Faites un clic droit sur la tête de la table que vous souhaitez supprimer et sélectionnez "Supprimer du modèle".
  3. Cliquez à nouveau avec le bouton droit de la souris sur l'espace de travail et sélectionnez "Mettre à jour le modèle à partir de la base de données .."
  4. Ajouter à nouveau la table à partir de la liste des tables
  5. Nettoyer et construire la solution
5
Arun

J'ai constaté cette erreur lorsqu'une table existante de la base de données ne mappe pas correctement vers un premier modèle de code. Plus précisément, j'avais un caractère (1) dans la table de base de données et un caractère en C #. Changer le modèle en chaîne a résolu le problème.

3
Daniel Leach

Mon problème a été résolu en mettant à jour la partie métadonnées de la chaîne de connexion. Apparemment, il pointait vers la mauvaise référence .csdl/.ssdl/.msl.

2
ragnarswanson

Une autre chose à vérifier avec votre chaîne de connexion - le nom du modèle. J'utilisais deux modèles d'entité, DB en premier. Dans la configuration, j'ai copié la connexion d'entité pour une, la renommée et modifié la partie chaîne de connexion. Ce que je n’ai pas changé, c’est le nom du modèle. Ainsi, alors que le modèle d’entité était généré correctement, au début du contexte, EF cherchait le mauvais modèle pour les entités. 

Cela semble évident, mais il y a quatre heures que je ne reviendrai pas. 

1
Eddie

Pour moi, le problème était que j'ai utilisé le connection string généré par le modèle ADO.Net (.edmx). Changer la chaîne de connexion a résolu mon problème.

0
FN90

Visual Studio 2019 semble causer cela pour moi. Je l'ai corrigé en générant le modèle edmx à nouveau en 2017.

0
chinupson

si vous essayez d'abord de base de données, assurez-vous que votre table a clé primaire

0
Mahmoud

la carte de l'entité (même vide) ajoutée à la configuration entraînera l'intégration du type d'entité au contexte. Nous avions une entité sans relation avec d'autres entités qui a été corrigée avec une carte vide.

0
mcfea

Cela peut également se produire si vous utilisez un cache de modèle persistant obsolète pour une raison ou une autre. Si votre contexte a été mis en cache dans un fichier EDMX sur un système de fichiers (via DbConfiguration.SetModelStore), OnModelCreating ne sera jamais appelé car la version mise en cache sera utilisée. Par conséquent, si une entité manque dans votre magasin mis en cache, vous obtiendrez l'erreur ci-dessus même si la chaîne de connexion est correcte, la table existe dans la base de données et l'entité est configurée correctement dans votre DbContext.

0
strickt01