Bonjour !
Je travaille sur un web service qui recupere des donnees qu'on lui envoie depuis d'autres systemes (grosso modo juste pour la mise en contexte) en C#.
La bdd est sur sqlserver.
Je travaille sur un schema ou une Propriete possede une MonnaieContratId et une MonnaieActuelId, FK de MonnaieId sur la table Monnaie.
J'ai correctement mapper mon DBML, j'ai donc deux entityRef MonnaieContrat et MonnaieActuel dans ma classe Properiete.
Mon code recoit une propriete, dans un format, et fait juste correspondre ces donnees a mon objet dans mon webservcie afin dy ajouter/actualiser dons ma BDD (jespere que je suis claire ...)
J'utilise un cache pour les monnaies, je charge donc toutes les monnaies dans un cache et si le cache na pas ete charge je le fait et requete le cache au lieu de la BDD.
Mon problem est que lorsque je recupere mon objet monnaie depuis le cache jo'btiens l'erreur System.Data.Linq.DuplicateKeyException: Cannot add an entity with a key that is already in use.
Si je requete directement mon dataContext SubmitOnChanges marche parfaitement.
J'ai eassye plusieurs chose comme utilise Attach ou Refresh, proprietes du dataContext. J'ai meme lus qqpart que activer Identity sur ma primary key mais cela ne marche pas.
Mon code simplifier :
Au niveau du cache c'est qqch comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 DataContextFactory dataContextFactory = new DataContextFactory() CurrencyRepositoryCache currencyCache = new CurrencyRepositoryCache(new CurrencyRepository(dataContextFactory )); providerToCheck.WorkingCurrency = currencyCache.GetCurrencyByCode(providerToProcess.WorkingCurrency); dataContextFactory .SubmitChanges();
Si vous avez des suggestions je suis preneur !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //Recupere les donnes de la bdd List<Currency> currencies = ReadOnlyInstance.currencyRepository.GetCurrencyList(); List<CurrencyFeeCode> currencyFeeCodes = ReadOnlyInstance.currencyRepository.GetCurrencyFeeCodeList(); //Load cache HttpRuntime.Cache["Currencies"] = currencies; HttpRuntime.Cache["CurrencyFeeCodes"] = currencyFeeCodes; var currencies = (List<Currency>) HttpRuntime.Cache["Currencies"]; return currencies.FirstOrDefault(c => c.Code.ToUpper() == code.ToUpper());
Merci par avance
Partager