2010-12-06 44 views
0

Actuellement, je suis en utilisant le code suivant pour effectuer un « upsert » dans CRMmanière propre à faire une upsert (mise à jour ou insertion) dans le fonctionnement Dynamics CRM 4

try 
{ 
crm.Create(c); 
} 
catch (SoapException) 
{ 
crm.Update(c); 
} 

Suis-je raison de supposer que ce type de mise à jour effacera toutes les informations existantes de mon entité commerciale? Et si oui, comment puis-je obtenir l'entité à mettre à jour à partir du référentiel? Ai-je besoin de fetch, retrieve, ou quelque chose comme ça?

Merci.

+1

Si les informations de 'c' sont effacées ou non dépend de la façon dont il est défini. Lors d'une mise à jour, seuls les attributs qui ne sont pas NULL sont mis à jour. Pouvez-vous montrer comment vous définiriez 'c' dans le contexte décrit? – ccellar

Répondre

2

L'utilisation de la gestion des exceptions pour le contrôle de flux est mauvaise dans 99,99% des cas; dans ce cas entre autres parce que vous ne savez jamais quelle est la raison réelle de votre SoapException.

Une manière beaucoup plus propre serait de vérifier si le champ ID de votre enregistrement a une valeur; si c'est le cas, faites une mise à jour, sinon, faites un Create (et ajoutez peut-être l'identifiant résultant à votre objet si vous l'utilisez plus loin). (Nous avons vu une création sur un enregistrement avec un ID fait une mise à jour il y a des années, mais nous n'avons jamais été capable de le reproduire.)

À part ça, @ckeller a parfaitement raison; un attribut qui est nul dans votre objet (car il n'était pas dans le ColumnSet lors de la récupération de la base de données ou n'a pas été défini autrement) ne sera pas touché dans une mise à jour.