2011-02-09 12 views
5

Ho appena iniziato a utilizzare i contratti di codice nel mio progetto. Tuttavia, ho un problema con l'implementazione del mio repository, che interroga il mio database usando Entity Framework.Contratti di codice .NET 4: "richiede unproven: source! = Null"

ho il seguente metodo:

public IEnumerable<Organization> GetAllOrganizations() 
{ 
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable(); 
} 

Il metodo restituisce un insieme contenente tutte le organizzazioni nel database, o un insieme vuoto non c'è organizzazioni nel database.

Tuttavia, questo non va bene secondo il CodeContracts, che mi danno l'errore: "richiede non provata: source = null"

Che cosa sta cercando di dirmi? Posso soddisfare i contratti di codice usando Contract.Assume, per supporre che troverà sempre qualcosa, ma poi ho bisogno di farlo in tutti i metodi che leggono i dati dal database.

Mi manca qualcosa qui o è il comportamento previsto quando si lavora con database e LINQ?

+0

Che cos'è "fonte"? Qualcuno dei metodi che stai chiamando ha dei contratti? –

+2

È [questo] (http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql) chiedere aiuto? – adrianbanks

+0

@Anon: non ho idea di cosa sia "fonte". Non sono a conoscenza dell'esistenza di contratti sui metodi in Entity Framework, ma non penso. @ Adrianbanks: No, mi dispiace, non riesco a capire come possa aiutarmi. – Vern

risposta

2

La mia ipotesi è che uno dei metodi CreateSet, OfType e AsEnumerable sia dichiarato come un metodo di estensione con un parametro di questo tipo chiamato "source" e CodeContrcts non può dimostrare che non è null. Inoltre, non è necessario aggiungere una clausola Requires per specificare che _uow non è nullo alla voce?

CreateSet sembra essere il metodo di estensione poiché non viene visualizzato in MSDN. Se il metodo non deve mai restituire null, è possibile applicare questo con l'aggiunta di questo contratto per CreateSet:

Contract.Ensures(Contract.Result<T>() != null); 

Quando l'analizzatore CodeContracts vede questa regola, ci vorrà come prova che l'ingresso al OfType non sarà nullo, e l'avviso dovrebbe andare via.

+0

Molto probabilmente 'AsEnumerable', che ha una precondizione' source! = Null'. Non sono sicuro che ci siano molti (eventuali?) Contratti sui metodi in Entity Framework, quindi né 'CreateSet' né' OfType' hanno post-condizioni su di essi. Potrebbe essere necessario creare le proprie funzioni wrapper. – porges

+0

È possibile impostare una condizione preliminare solo se il chiamante del codice è responsabile del rispetto di tale precondizione. In questo caso, sembra che _uow sia una responsabilità interna, non quella del chiamante. – koenmetsu

+0

hai ragione che ho bisogno di una clausola Requires per specificare che _uow non è nullo. Ma dopo aver aggiunto che sto ancora ricevendo l'errore. @Porges: Penso che tu abbia ragione sul fatto che AsEnumerable sia la causa qui. Ho fatto alcuni test con AsEnumerable e ho avuto il problema anche qui. Sembra un compito piuttosto noioso scrivere funzioni wrapper per molte funzioni, quando si utilizzano API di terze parti che non utilizzano contratti di codice. Dovrò riconsiderare l'uso dei contratti di codice. – Vern

Problemi correlati