Dependancy Injected DbContext est vide après avoir rempli DbContext créé avec new (EF7, ASP.NET 5, vnext)

asp.net asp.net-core dbcontext entity-framework entity-framework-core

Question

Je suis relativement nouveau dans EF7 et j'ai entendu dire que l'injection de dépendances de DbContexts dans le constructeur du contrôleur est un bon moyen d'obtenir le DbContext pour une utilisation dans des méthodes Action données. Cependant, dans de nombreuses situations, l’injection de dépendances est impossible (par exemple, accéder à la base de données dans des classes ordinaires) et using(VectorDbContext dbContext...) modèle using(VectorDbContext dbContext...) .

J'ai rencontré un problème dans lequel l'ajout de données à un DbContext créé à l' using modèle using n'est pas accessible par un contexte auquel une dépendance a été injectée. DbContext est une base de données InMemory simple utilisée pour les tests - elle ne se connecte à rien.

Voici le code qui ajoute des entités au DbContext, pour tester j'appelle cela dans Startup.cs:

using (ExampleDbContext dbContext= new ExampleDbContext()) {
    dbContext.Things.Add(
        new Thing() {
            Stuff= "something"
        });

    dbContext.SaveChanges();
}

Voici le code d'accès dans le contrôleur:

public class ExampleController : Controller {
    public ExampleController(ExampleDbContext exampleDbContext) {
        this.ExampleDbContext= exampleDbContext;
    }

    public ExampleDbContext ExampleDbContext { get; set; }

    public async Task<IActionResult> ExampleAction() {

        // new DbContext:
        using(ExampleDbContext dbContext = new ExampleDbContext ()) {
            var List1 = (await dbContext.Things
                .AsNoTracking()
                .ToListAsync());
        }

        // Injected DbContext:
        var List2 = (await this.ExampleDbContext.Things
            .AsNoTracking()
            .ToListAsync());
    }
}

Lors de la progression, List1 contient l'élément attendu, mais List2 est toujours vide!

Qu'est-ce que je fais mal? Il semble que les DbContexts ne soient pas synchronisés d'une manière ou d'une autre. Comment Dependency Injection crée-t-il le DbContext / d'où vient-il?

EDIT: Je viens de faire quelques tests supplémentaires et j'ai confirmé que toutes les entités ajoutées dans DbContext créé avec new ne sont visibles que dans new , et les entités ajoutées dans Injected DbContext ne sont visibles que dans Injected DbContext, ce qui me porte à croire qu'elles se connectent bases de données de sauvegarde différentes, mais je ne peux pas confirmer.

Réponse acceptée

Je me trompe peut-être, mais je suppose que lorsque vous créez une nouvelle instance de DbContext dans le code, vous utilisez le constructeur sans paramètre qui définit la chaîne de connexion sous-jacente à une valeur par défaut. Cependant, DbContext DI injecté pourrait être résolu en utilisant un autre constructeur avec une chaîne de connexion différente passée explicitement.

Voici un exemple de configuration d'Unity qui spécifie explicitement le paramètre constructeur:

<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
    <param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>

Donc, je vérifierais une configuration de votre conteneur.



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