2

Il y a une caractéristique intéressante existe dans le cadre entité de base:Entité noyau-cadre: Comment tester la navigation propery chargement lorsque l'utilisation en mémoire datastore

Entity Framework Core automatiquement fix-up propriétés de navigation à tout autre entités qui ont été précédemment chargées dans le contexte instance. Par conséquent, même si vous n'incluez pas explicitement les données pour une propriété de navigation , la propriété peut toujours être remplie si certaines entités ont déjà été chargées.

Ceci est agréable dans certains cas. Cependant, à l'heure actuelle, j'essaie de modéliser plusieurs-à-plusieurs relations avec des ajouts syntaxiques avancés et je ne veux pas vérifier que la cartographie que je crée fonctionne bien.

Mais je ne peux pas vraiment faire, car si nous allons dire que j'ai quelque chose comme:

class Model1{ 
    ... // define Id and all other stuff 
    public ICollection<Model2> Rel {get; set;} 
} 

Model1 m1 = new Model1(){Id=777}; 
m1.Rel.Add(new Model2()); 
ctx.Add(m1); 
ctx.SaveChanges() 

var loaded = ctx.Model1s.Single(m => m.Id == 777); 

donc due au champ auto-fixup loaded.Rel sera déjà remplie, même si je ne comprennent rien . Donc, avec cette fonctionnalité, je ne peux rien vérifier. Impossible de vérifier que j'utilise un mappage approprié et que mes ajouts à Include fonctionnent correctement. Ayant à l'esprit, que dois-je changer pour être en mesure de tester mes propriétés de navigation correctement? Je crée un test qui devrait passer, mais qui échoue maintenant. J'utilise .NET Core 2.0 preview 1 et EF core selon cela.

+0

Vous pouvez créer un nouveau 'DbContext' qui n'a aucune entité créée et faire la deuxième requête dessus, mais vous devez lui injecter' DbContextOptions' et le passer à son constructeur – Tseng

+0

Oui. J'ai essayé ça. Mais il semble que lorsque vous utilisez le datastore inmemory lorsque vous créez un nouveau DbContext, vous créez un magasin inmemory complètement propre (même si le nom de DB dans les options est le même), donc dans un nouveau contexte il n'y a pas de données sauvegardées précédemment. tester quoi que ce soit. –

+0

@Tseng J'ai ajouté le cas réel de Faling dans le corps de la question, de sorte que vous pouvez vérifier, si je fais quelque chose de mal. –

Répondre

4

Si vous souhaitez tester les propriétés de navigation avec le magasin de données en mémoire, vous devez charger vos articles en mode "non-suivi", en utilisant l'extension AsNoTracking().

Donc, pour votre cas si vous var loaded = ctx.Model1s.Single(m => m.Id == 777); retour article avec des relations, que si vous repassez à:
var loaded = ctx.Model1s.AsNoTracking().Single(m => m.Id == 777); cela vous renvoyer l'article brut sans DEPS. Donc, si vous voulez encore vérifier Include, vous pouvez écrire quelque chose comme ctx.Model1s.AsNoTracking().Include(m => m.Rel).Single(m => m.Id == 777); et cela vous renverra le modèle avec les relations que vous incluez.