UnintentionalCodeFirstException | Entity Framework Unit Testing avec Effort.Ef6 en utilisant Database First

c# effort entity-framework entity-framework-6 unit-testing

Question

La situation

Je souhaite activer les tests unitaires de mon DbContext sur la base de la structure d'entité 6. J'ai créé mon DbContext et mes modèles avec la première approche de la base de données et j'ai maintenant un fichier de concepteur .edmx .

Le problème

Mon DbContext créé automatiquement remplace la méthode DbContext.OnModelCreating comme ceci:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

J'essaie de créer une nouvelle instance de mon DbContext dans mon service d'accès aux données DbContext basé sur les informations de cet article . Mon code ne s'exécute pas dans Database.SetInitializer; comme l'auteur de ce blog a souligné. Mon constructeur ressemble exactement au sien. Mon initialisation DbContext ressemble à ceci:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Ce qui entraîne l’exception suivante lorsqu’on atteint l’objet OnModelCreating mentionné OnModelCreating

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'Le contexte est utilisé en mode code premier avec du code généré à partir d'un fichier EDMX pour le développement de base de données ou de modèle premier. Cela ne fonctionnera pas correctement. Pour résoudre ce problème, ne supprimez pas la ligne de code qui lève cette exception. Si vous souhaitez utiliser Database First ou Model First, assurez-vous que la chaîne de connexion Entity Framework est incluse dans le fichier app.config ou web.config du projet de démarrage. Si vous créez votre propre DbConnection, assurez-vous qu'il s'agit d'un EntityConnection et non d'un autre type de DbConnection, et que vous le transmettez à l'un des constructeurs de base de DbContext qui prennent un DbConnection. Pour en savoir plus sur Code First, Database First et Model First, consultez la documentation d'Entity Framework à l'adresse suivante: http://go.microsoft.com/fwlink/?LinkId=394715 '.

Il y a beaucoup de questions sur stackoverflow qui se concentrent sur le test unitaire avec effort lors de l'utilisation de la base de données d'abord, mais personne ne semble avoir de problèmes similaires à ceux que je connaisse.

Ce que j'ai déjà essayé de faire

  • Rechercher longtemps sur Internet pour trouver une solution.
  • Décommentez OnModelCreating() .
  • J'ai déjà essayé d'appliquer cette solution sans succès.
  • Mock mon DbContext avec Moq , ce qui n'est certainement pas une option.

La question

Comment créer et utiliser une base de données en mémoire (avec effort)?


Information additionnelle

Lorsque je ne OnModelCreating() , une exception sera levée lors du premier accès au DataContext. Par exemple:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

System.Data.Entity.ModelConfiguration.ModelValidationException: 'Une ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle: MyApplication.Shared.Model.KeyValuePair:: EntityType' KeyValuePair 'n'a pas de clé définie. Définissez la clé pour ce type d'entité. KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' est basé sur le type 'KeyValuePair' qui n'a pas de clé définie '.

Réponse acceptée

Le problème était que je devais spécifier la clé pour mon ensemble de données KeyValuePair.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

Merci beaucoup Robert Jørgensgaard Engdahl !




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi