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 .
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:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
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.
OnModelCreating()
. DbContext
avec Moq , ce qui n'est certainement pas une option. 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:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
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 '.
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 !