UnintentionalCodeFirstException | Entity Framework Unit Testing with Effort.Ef6 utilizzando Database First

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

Domanda

La situazione

Voglio abilitare il test delle unità del mio DbContext basato sul framework di entità 6. Ho creato il mio DbContext ei miei modelli con il primo approccio al database e ora un file di progettazione .edmx .

Il problema

Il mio DbContext creato automaticamente sovrascrive il metodo DbContext.OnModelCreating questo modo:

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

Sto cercando di creare una nuova istanza del mio DbContext nel mio servizio di accesso ai dati deriso in base alle informazioni di questo articolo . Il mio codice non viene eseguito in Database.SetInitializer; come ha sottolineato l'autore di questo post. Il mio costruttore sembra esattamente come il suo. L'inizializzazione di DbContext è simile a questa:

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

Il che si traduce in un'eccezione successiva al raggiungimento del precedente OnModelCreating override

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'Il contesto viene utilizzato in modalità Primo codice con codice generato da un file EDMX per lo sviluppo Database First o Model First. Questo non funzionerà correttamente. Per risolvere questo problema non rimuovere la riga di codice che genera questa eccezione. Se si desidera utilizzare Database First o Model First, assicurarsi che la stringa di connessione di Entity Framework sia inclusa in app.config o web.config del progetto di avvio. Se si sta creando il proprio DbConnection, assicurarsi che sia un EntityConnection e non un altro tipo di DbConnection e che lo si passi a uno dei costruttori di base DbContext che accettano un DbConnection. Per ulteriori informazioni su Code First, Database First e Model First, consultare la documentazione di Entity Framework qui: http://go.microsoft.com/fwlink/?LinkId=394715 '

Ci sono un sacco di domande su StackOverflow che si concentrano sui test delle unità con sforzo mentre si utilizza il primo apporach del database, ma nessuno sembra avere problemi simili come me.

Quello che ho già provato a fare

  • Cercando in Internet molto tempo per una soluzione.
  • OnModelCreating() il commento da OnModelCreating() override.
  • Ho già provato ad applicare questa soluzione senza successo.
  • Mock my DbContext con Moq , che non è sicuramente un'opzione.

La domanda

Come posso creare e utilizzare un database in memoria (con sforzo)?


Informazioni aggiuntive

Quando OnModelCreating() l' OnModelCreating() , verrà lanciata un'eccezione al primo accesso a DataContext. Per esempio:

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

System.Data.Entity.ModelConfiguration.ModelValidationException: "Uno o più errori di convalida sono stati rilevati durante la generazione del modello: MyApplication.Shared.Model.KeyValuePair:: EntityType 'KeyValuePair' non ha alcuna chiave definita. Definire la chiave per questo EntityType. KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' è basato sul tipo 'KeyValuePair' che non ha chiavi definite. '

Risposta accettata

Il problema era che dovevo specificare la chiave per il mio set di dati KeyValuePair.

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

Grazie mille Robert Jörgensgaard Engdahl !




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é