Rimuovi i riferimenti alle chiavi esterne in Sforzo

c# effort

Domanda

Sto usando Effort in Visual Studio e C # per ricreare e testare unitamente un database. Sto scrivendo una classe per una singola tabella e quindi sto solo compilando il database con gli oggetti di quella tabella. Il mio problema è che il database di sforzo richiede che le chiavi esterne dell'oggetto facciano riferimento a oggetti reali nel database.

Il mio errore è

System.Data.Entity.Infrastructure.DbUpdateException: si è verificato un errore durante l'aggiornamento delle voci. Vedi l'eccezione interna per i dettagli.

System.Data.Entity.Core.UpdateException: si è verificato un errore durante l'aggiornamento delle voci. Vedi l'eccezione interna per i dettagli.

System.Reflection.TargetInvocationException: l'eccezione di una chiamata è stata lanciata dalla destinazione.

NMemory.Exceptions.ForeignKeyViolationException: violazione della chiave esterna [Table1: SettingsId]. Il valore chiave [0] non esiste nella tabella di riferimento [Table2 :: SettingsId]. Codice di errore: RelationError

Poiché questa tabella particolare ha molte chiavi esterne per gli oggetti che hanno molte altre chiavi esterne richiederebbe molto lavoro. C'è qualche modo in Effort per disattivarlo in modo che io possa testare questo tavolo da solo?

Risposta accettata

Mi sono imbattuto in questo problema e volevo testare la tabella nell'ambito del database più grande. Puoi creare un metodo di supporto che istanzia solo tutto ciò che ti serve e passa il database o la tabella con i riferimenti come risultato. Questo ti aiuta perché puoi chiamarlo da qualsiasi metodo / classe di test di cui hai bisogno e ogni volta che ne hai bisogno.


Risposta popolare

È possibile creare un nuovo file .edmx dal proprio database per il solo utilizzo di test. Per esempio:

In Visual Studio selezionare File-> Nuovo-> Dati-> Entità DataModel. Seleziona "Designer EF dal database". Scegli o crea una connessione al tuo database SQL Server esistente e salva le impostazioni di connessione in app.config come "testConnectionString".

Nella finestra di progettazione del modello dati, rimuovere le relazioni con le chiavi esterne non necessarie. Salva il designer e ricostruisci il progetto.

In Sforzo, passa il nome della stringa di connessione (che è stata generata quando hai creato il nuovo .edmx) nel metodo CreateTransient , in questo modo:

EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");

MyDbContext context = new MyDbContext(connection);

Ciò dovrebbe consentire di inserire valori nella tabella senza la necessità di popolare le tabelle delle chiavi esterne correlate.

Questo viene fornito con un avvertimento, tuttavia - se il codice che stai test utilizza qualsiasi proprietà di navigazione che dipende dalle chiavi esterne, fallirà. Questo mi fa domandare quanto sia davvero prezioso questo tipo di "test unitario".




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é