Impossibile utilizzare il database esistente nei test unitari con il framework Effort

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

Domanda

Sto provando a scrivere test usando un database, ospitato in SQL di Azure, con il framework Effort su Entity Framework 6.

Quando si esegue il seguente codice, viene generata un'eccezione:

[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
    EffortProviderConfiguration.RegisterProvider();
}

[TestMethod]
public void TestMethod1()
{
    const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
    IDataLoader loader = new EntityDataLoader(connectionString);
    using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
    {
        var usersCount = ctx.Users.Count();
    }
}

Eccezione generata nell'esecuzione Count() :

Effort.Exceptions.EffortException: eccezione non gestita durante il tentativo di inizializzare il contenuto della tabella 'Tabella' ---> System.ArgumentException: Parola chiave non supportata: 'origine dati'.

La stessa eccezione viene generata quando si sostituisce EffortProviderConfiguration.RegisterProvider() con le impostazioni di app.config.

Quando si utilizza esattamente la stessa stringa di connessione per la creazione di UsersDbContext esso riesce e i dati sono accessibili. Inoltre, la creazione di un contesto con la modalità persistente o transitoria dello sforzo, senza la stringa di connessione, funziona bene.

Cosa si dovrebbe fare per inizializzare una connessione con i dati esistenti da un vero DB?

Risposta popolare

Se come me sei confuso sul motivo per cui devi dare a Effort una stringa di connessione (dato che funziona su un database in memoria, e fornisci direttamente al tuo contesto una connessione), la documentazione lo rende un po 'più chiaro - è Richiesto solo se si utilizzano le varianti di database first o model-first di Entity Framework, perché la stringa di connessione Entity fornisce le informazioni necessarie per lo sforzo per individuare il modello in modo che possa creare uno schema da esso !! Quindi puoi tranquillamente riempire le porzioni server / database / id utente / password della stringa di connessione con nomi fittizi.

Ciò chiarisce anche che l'approccio DbConnectionFactory predefinito personalizzato funziona solo per code-first, il che spiega le prime ore di errori che stavo ottenendo ... Per prima il modello o prima il database, devi inserire una connessione di entità nella tua classe di entità , come descritto qui .

Un suggerimento utile: poiché la classe del modello entità generata è una classe parziale, è possibile creare un altro file di codice nello stesso assembly, assegnargli lo stesso spazio dei nomi e renderlo anche una classe parziale ed è possibile aggiungere il secondo costruttore necessario per l'impostazione del EntityConnection al file di codice invece, in questo modo quando modifichi / ricrea il tuo modello di entità, il codice con il costruttore personalizzato non verrà eliminato dal modello t4.




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é