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.
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.
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=
"data source=(localdb)\v11.0;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
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>
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; }
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.
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:
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.
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.
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.
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.
Visual Studio 2019 semble causer cela pour moi. Je l'ai corrigé en générant le modèle edmx à nouveau en 2017.
si vous essayez d'abord de base de données, assurez-vous que votre table a clé primaire
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.
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.