2016-11-23 8 views
0

J'essaie de déterminer si une collection paresseuse a été chargée ou non, donc je sais si je dois l'inclure dans le DTO. Voici mon code.IsInitialized ne fonctionne pas avec NHibernate LINQ

Contrôleur

IEnumerable<Store> stores = StoreService.GetList(new int[] { 1, 2}, true); 

StoreDTO tStore = StoreService.GetDTO(stores.First()); 

StoreService

public IEnumerable<Store> GetList(int[] Ids, bool stockItems = false) 
    { 
     IQueryable<Store> stores = StoreRepository.GetList(Ids); 

     if (stockItems) 
      stores.Fetch(s => s.StockItems); 

     return stores.ToList(); 
    } 

public StoreDTO GetDTO(Store store) 
    { 
     StoreDTO storeDTO = Mapper.Map<Store, StoreDTO>(store); 

     bool itemsFetched = NHibernate.NHibernateUtil.IsInitialized(store.StockItems); 

     if(itemsFetched) { /** do stuff **/ } 

     return storeDTO; 
    } 

problème est itemsFetched est toujours faux, mais si je mets un point de rupture sur elle et puis utiliser le débogueur VS pour regarder les stockpièces puis laissez le point de rupture à travers elle retourne vrai. Est-ce que cela signifie que le fournisseur NHibernate LINQ est cassé ou est-ce que quelque chose me manque ici?

Merci

+0

Pouvez-vous écrire le code pour 'StoreRepository.GetList()'? –

Répondre

2

Je suppose que IsInitialized() retourne false parce que vous ne l'avez pas appliqué à l'opération d'extraction IQueryable que vous êtes en train d'exécution. Essayez:

if (stockItems) 
    stores = stores.Fetch(s => s.StockItems); 

pendant/après le débogage, IsInitialized() retourne vrai parce que le débogueur lui-même déclenche la charge paresseuse de la collection lorsque vous explorez l'objet.

+0

Cela a fait l'affaire, merci! – user2119597