mi sono imbattuto al problema successivo ... devo contesto di database:Utilizzando IQueryable <TEntity> invece DbSet <TEntity> problema
// For support unit testing...
public interface IDbContext : IDisposable
{
IQueryable<Hardware> Hardwares { get; }
IQueryable<ProviderHardware> ProviderHardwares { get; }
}
// Real DbContext (EF 4.0, Code First)
public class PrimaryDbContext : DbContext, IDbContext
{
public DbSet<Hardware> Hardwares { get; set; }
public DbSet<ProviderHardware> ProviderHardwares { get; set; }
IQueryable<Hardware> IDbContext.Hardwares
{ get { return Hardwares; } }
IQueryable<ProviderHardware> IDbContext.ProviderHardwares
{ get { return ProviderHardwares; } }
...
}
e cerco ottenere tutte le parti metalliche, che esiste pretende molto nella tabella ProviderHardwares:
var hardwaresRemoved = db.Hardwares.Where(i => (i.IsAvailable == true) &&
(db.ProviderHardwares.Count(j => j.Article == i.Article) == 0)).ToList();
Se uso PrimaryDbContext rigorosamente come "PrimaryDbContext db = new PrimaryDbContext();" tutto funziona bene Ma se lo uso implicitamente "IDbContext db = new PrimaryDbContext();" che ottengo un'eccezione:
Impossibile creare un valore costante di tipo 'ConfiguratorMvcApplication.DomainModels.ProviderHardware'. Solo i tipi primitivi ('come Int32, String e Guid') sono supportati in questo contesto in .
Riassumere, non è possibile sostituire un DbSet su un IQueryable. E come posso usare il test delle unità in questo caso? Spero che qualcuno abbia ancora risolto questo problema ... Grazie in anticipo molto!
Stai dichiarando una costante ovunque nel tuo 'PrimaryDbContext'? –
No, solo che ho dimostrato prima ... E sovrascrivo il metodo OnModelCreating di più ... – xtmq
Posso riprodurlo. Ho anche visto (con SQL Profiler) che nel caso 'IDbContext'' db.ProviderHardwares' all'interno dell'espressione viene eseguito come una query che carica * tutte * 'ProviderHardware' righe dal database (* come se *' IDbContext.ProviderHardwares 'erano un' IEnumerable' e non 'IQueryable'). Quindi il 'Count' e la query esterna non possono essere eseguiti perché l'elenco di oggetti in memoria (elenco di oggetti" costanti ") non può essere utilizzato in SQL. Ciò causa l'eccezione. Perché EF considera 'IDbContext.ProviderHardwares' come un' IEnumerable' ma non 'PrimaryDbContext.ProviderHardwares'? Nessun indizio ... – Slauma