2011-05-26 4 views
1

Je remarque que le modérateur CRM David Jennaway sur le forum technet indique que vous ne pouvez pas utiliser LINQ mettre à jour/Créer des enregistrements en voir CRM 2011 ici http://social.microsoft.com/Forums/en-IE/crmdevelopment/thread/682a7be2-1c07-497e-8f58-cea55c298062LINQ CRM 2011 Mise à jour - Créer

Mais j'ai vu quelques threads qui font paraître comme si cela devrait fonctionner. Voici ma tentative qui ne fonctionne pas. Des idées pourquoi pas?

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 
OrganizationServiceContext orgContext = new OrganizationServiceContext(service); 

EntityState state = new EntityState(); 
state = EntityState.Changed; 

var counter = from c in orgContext.CreateQuery<pcx_entitycounter>() 
     where c.pcx_name.Contains("pcx_candidate") 
     select new pcx_entitycounter 
     {Id = c.Id, 
     pcx_name = c.pcx_name, pcx_Sequence = c.pcx_Sequence, pcx_Prefix = c.pcx_Prefix 

     }; 

foreach (var c in counter) 
     { 
      string prefix = c.pcx_Prefix.ToString(); ; 
      string sequence = c.pcx_Sequence.ToString(); 

      c.pcx_Sequence = c.pcx_Sequence + 1; 
      c.EntityState = state; 
      **service.Update(c);** //FAILS HERE 

     } 
+2

Comment est ce LINQ pour les mises à jour? Je vois que vous exécutez une requête LINQ mais pas dans la mise à jour actuelle? Quelle exception obtenez-vous? –

+0

Serait certainement utile de voir l'exception et tous les détails pour cela. – cchamberlain

Répondre

2

Dans mon expérience, il a été difficile à impossible de récupérer une entité du contexte, mettre à jour, puis utilisez le service pour enregistrer les modifications. Cela m'a causé des maux de tête à comprendre!

Étant donné que votre code de récupération utilise une requête du contexte, toutes ces entités doivent être attachées au contexte et leurs états sont suivis. Ainsi, vous devez utiliser la méthode de contexte pour la mise à jour:

foreach (var c in counter) { 
    string prefix = c.pcx_Prefix.ToString(); ; 
    string sequence = c.pcx_Sequence.ToString(); 

    c.pcx_Sequence = c.pcx_Sequence + 1; 

    // Use the Context to save changes 
    orgContext.UpdateObject(c); 
    orgContext.SaveChanges(); 
} 

Comme beaucoup de mon code récupérera des entités de différentes façons (c.-à-Service ou contexte) en fonction de la situation, je l'ai mis au point une méthode simple qui sait comment mettre à jour l'entité correctement. Pour développer votre exemple, vous pourriez avoir une méthode de mise à jour qui ressemble à:

public void UpdatePcxEntityCounter(pcx_entitycounter c) { 
    if (!orgContext.IsAttached(c)) { 
     service.Update(c); 
    } 
    else { 
     orgContext.UpdateObject(c); 
     orgContext.SaveChanges(); 
    } 
} 

Cela suppose à la fois orgContext et service sont disponibles à périmètre supérieur à celui de la méthode. Sinon, ils devront être transmis en tant que paramètres supplémentaires.

0

Sans voir la difficile il est difficile de discerner quel est le problème, mais avez-vous essayé d'utiliser orgContext.UpdateObject (c); avant de faire l'étape de mise à jour? En outre, vous ne savez pas pourquoi vous affectez le préfixe et la séquence aux variables locales de votre boucle car elles ne semblent pas être utilisées. Il est possible que vous obteniez une exception SOAP ou quelque chose pour assigner des valeurs qui ne fonctionnent pas. Avez-vous des plugins enregistrés sur l'entité?

Voir les liens suivants pour les résolutions possibles -

How to update a CRM 2011 Entity using LINQ in a Plugin?

http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/7ae89b3b-6eca-4876-9513-042739fa432a

Questions connexes