2010-09-10 11 views
1

Quelle question maladroite, pensez-vous? Quand mon application se charge, elle va à la base de données et récupère plusieurs valeurs de tables de recherche différentes et crée des listes .NET pour chacune d'entre elles et les place dans le cache. Par exemple, "Statut".Comment puis-je empêcher le bloc de mise en cache de la bibliothèque d'entreprise de modifier de façon persistante les données que j'en ai extraites?

Liste à ce moment: On, Off

Lorsque je récupère la liste des états à partir du cache, ajouter un autre élément à la liste, « Faites votre choix » et l'ensemble comme le ItemsSource d'un Boîte combo. À aucun moment, je ne mets la nouvelle liste, contenant maintenant "Choisir un" en plus de la liste des statuts dans le cache.

List<ContractStatus> contractStatuses = (List<ContractStatus>)this._cacheManager["CurrentContractStatuses"]; 

     ContractStatus contractStatus = new ContractStatus 
      { 
       ContractStatusDescription = "Choose One", ContractStatusId = 0 
      }; 
     contractStatuses.Insert(0, contractStatus); 

Liste à ce moment: Choisissez un, On, Off

Pourtant, si je vais à un autre écran et revenir, la routine de charge de l'écran tire la liste des statuts du cache, et Choisissez Un est déjà dans la liste. Ainsi, lorsque la routine ajoute: "Choisissez un" je le vent avec:

Choisissez un, Choisissez un, On, Off

Est-ce par la conception? Comment diable le dis-je?

Répondre

0

Le Gestionnaire de cache renvoie une référence à votre List<ContractStatus>. Cette référence pointe vers l'objet dans le cache. Vous insérez ensuite un élément dans la même liste que dans le cache.

Est-il possible de mettre en cache une version de la liste qui inclut "Choisir un" de sorte que vous lisez uniquement la liste à partir du cache? Si oui, cela devrait éviter le "problème" que vous voyez.

Si vous avez besoin de manipuler la liste à partir du cache sans modifier la liste dans le cache, vous devez cloner la liste avant de le manipuler:

List<ContractStatus> contractStatuses =  
    (List<ContractStatus>)this._cacheManager["CurrentContractStatuses"]; 

// Clone the list (but not the items) 
List<ContractStatus> newStatuses = 
    contractStatuses.ConvertAll<ContractStatuses>(item => item); 

ContractStatus contractStatus = new ContractStatus 
{ 
    ContractStatusDescription = "Choose One", ContractStatusId = 0 
}; 

newStatuses.Insert(0, contractStatus);