DbContext Injected Deployment Injected è vuoto dopo aver popolato DbContext creato con new (EF7, ASP.NET 5, vnext)

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

Domanda

Sono relativamente nuovo a EF7 e ho sentito che Dipendenza per iniezione di DbContexts nel costruttore di Controller è un buon modo per ottenere DbContext per l'uso all'interno di determinati metodi Action. Tuttavia, ci sono molte situazioni in cui l'Iniezione delle Dipendenze è impossibile (ad esempio, l'accesso al Db nelle classi ordinarie) e l' using(VectorDbContext dbContext...) deve essere usato.

Ho riscontrato un problema in cui non è possibile accedere ai dati aggiunti a un DbContext creato con il modello using un contesto a cui è stata applicata la dipendenza. DbContext è un semplice database InMemory utilizzato per i test, non si connette a nulla.

Ecco il codice che aggiunge entità a DbContext, per il test sto chiamando questo in Startup.cs:

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

    dbContext.SaveChanges();
}

Ecco il codice di accesso all'interno del controller:

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());
    }
}

Quando si passa da un elenco all'altro, List1 ha l'elemento previsto in esso, ma List2 è sempre vuoto!

Che cosa sto facendo di sbagliato? Sembra che DbContexts non sia sincronizzato in qualche modo, in che modo Dependency Injection crea DbContext / da dove viene?

EDIT: Ho appena fatto alcuni test aggiuntivi e ho confermato che tutte le entità aggiunte all'interno di DbContext create con new sono visibili solo in new , e le entità aggiunte all'interno di DbContext Injected sono visibili solo all'interno di DbContext Injected, portandomi a credere che si stiano connettendo a diversi database di supporto, ma non posso confermare.

Risposta accettata

Potrei sbagliarmi, ma la mia ipotesi è che quando si crea una nuova istanza di DbContext nel codice, si utilizza il costruttore senza parametri che imposta la stringa di connessione sottostante su un valore predefinito. Tuttavia, DbContext DI-iniettato può essere risolto utilizzando un altro costruttore con una stringa di connessione diversa passata esplicitamente.

Questo è un esempio di Unity config che specifica esplicitamente il parametro del costruttore:

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

Quindi controllerei una configurazione del tuo contenitore.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché