none
Entity framework ChangeSet null RRS feed

  • Discussion générale

  • Bonjour
    j'ai dévellopé une application utilisant un Entity framework. J'ai généré un domain service pour l'accès à la base de donnée. Je parviens sans problème à ajouter des objet dans la bass de donnée en utilisant la methode ChangeSet générée dans mon domain service.

    Mon problème est que lorsque je récupère un objet "client" de la base de donnée, et que je modifie ses proprietés, je ne parviens pas à le mettre à jour dans la base de donnée. J'utulise la methode UpdateClient du domain service. 

    Dans cette méthode j'ai la ligne de code suivant qui me renvoi une erreur "Object reference not set to an instance of an object."

     

     this.ObjectContext.ClientJeu.AttachAsModified(currentClient, this.ChangeSet.GetOriginal(currentClient));

     


    Il s'avère que changeset est null. J'ai pourtant bien vérifié les propriétés de mon objet avant et après modification. L'objet que je passe à cette methode est bien modifié.

    Je ne comprends pas pourquoi le changeset reste null.

    quelqu'un peut-il m'aider? 


    Cédric Yumba
    • Type modifié Ciprian Duduiala mercredi 22 juin 2011 06:20 attente de feedback
    lundi 13 juin 2011 12:19

Toutes les réponses

  • Mes méthodes get et set de mon objet client sont exposées par un web service wcf. Je récupère l'objet via un client asp, j'effectue les modifications et ensuite j’appelle la méthode update.
    Cédric Yumba
    mercredi 15 juin 2011 09:50
  • Bonjour,

    Il faut nous montrer plus de votre code pour pouvoir reconstruire le contexte de votre erreur. Montrez-nous le code concernant votre domaine service. Consultez aussi cet exemple (en VB mais les algorithmes utilisées peuvent être utiles) concernant un domaine service dérivé de LinqToEntitiesDomainServices.

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 16 juin 2011 08:21
  • Bonjour
    Mon web service WCF expose les méthodes suivantes:
    public Client getClient_by_ID(int ID_Client)
            {
                
                {
                    return context.getClient_by_ID(ID_Client);
                }
                
            }
    public void update_Client(Client client)
            {
                
                {
                    context.UpdateClient(client);
                }
            }
    Context est une instance de mon domain service et voici l'implémentation des methodes:
    public Client getClient_by_ID(int ID_Client)
            {
                var q = from c in this.ObjectContext.ClientJeu
                        where c.ID_Client == ID_Client
                        select c;
                return q.SingleOrDefault<Client>();
            }
    public void UpdateClient(Client currentClient)
            {        
                    
                this.ObjectContext.ClientJeu.AttachAsModified(currentClient, this.ChangeSet.GetOriginal(currentClient));
                              
                
                    this.ObjectContext.SaveChanges();
            }
    Mon crossdomain est bien lié à mon fichier edmx. J'obtient l'erreur "Object reference not set to an instance of an object." au niveau de 
     this.ChangeSet.GetOriginal(currentClient)
    Le change set est null.
    Ce service wcf est référence dans une web application cliente ou je l'utilise de la manière suivante:
    //////////Sur la page 1
    Client client = new Client();
    client = service.getClient_by_ID(int.Parse(e.CommandArgument.ToString()));
    //Je passe ensuite mon client en session et je le récupère sur une autre page
    Session["client"] = client;
    //Sur cette autre page je modifie mon client et j'appelle la methode update.
    //////////Sur la page 2
    Client client = new Client();
    this.client = (Client)Session["client"];
            this.client.Nom = edt_nom_e.Text;
            this.client.Prénom = edt_prenom_e.Text;
            this.client.Pseudo = Edt_pseudo_e.Text;
            this.client.Adresse = edt_adresse_e.Text;
            this.client.Téléphone = edt_telephone_e.Text;
            this.client.Email = edt_email_e.Text;
            this.client.Type_Permis = cb_type_permi_e.Text;
            this.client.Année_Expérience = edt_experience_e.Text;
            this.client.Date_Naissance = cal_date_Naissance_e.SelectedDate;
            this.client.Date_Passage_Examen_theorique = cal_date_examen_theorique_e.SelectedDate;
            service.update_Client(this.client);

    Cédric Yumba
    jeudi 16 juin 2011 20:51
  • Bonjour,

    Il y a d’autres utilisateurs qui ont rapporté des problèmes similaires. La solution est d’avoir un code similaire avec le code d’exemple que je vous ai donné : il faut vérifier que currentClient.EntityState = EntityState.Detached  avant l’appel de la méthode AttachAsModified. Vérifiez cette solution et svp dites-nous le résultat. Consultez aussi cette discussion et la vidéo dont ils parlent pour mieux comprendre les DomainServices.

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.


    vendredi 17 juin 2011 08:51
  • Bonjour Ciprian,

    J'ai effectivement testé si mon objet était attaché à mon contexte. Il est bien attaché mais j'ai toujours le même message d'erreur au niveau du changeset qui est null.

     

    public void UpdateClient(Client currentClient)
        {
          if (currentClient.EntityState == EntityState.Detached)
          {
            this.ObjectContext.ClientJeu.AttachAsModified(currentClient, this.ChangeSet.GetOriginal(currentClient));
          }
          else
          {
            this.ObjectContext.ClientJeu.AttachAsModified(currentClient);
          }
          this.ObjectContext.ClientJeu.AttachAsModified(currentClient, this.ChangeSet.GetOriginal(currentClient));
          this.ObjectContext.SaveChanges();
        }
    


     


    Cédric Yumba
    vendredi 17 juin 2011 10:54
  • Bonjour,

    Je crois que vous n’avez pas besoin d’utiliser cette ligne

    this.ObjectContext.ClientJeu.AttachAsModified(currentClient,this.ChangeSet.GetOriginal(currentClient));

    deux fois. Essayez avec :

    public void UpdateClient(Client currentClient)

     

        {

     

          if (currentClient.EntityState == EntityState.Detached)

     

          {

     

            this.ObjectContext.ClientJeu.AttachAsModified(currentClient, this.ChangeSet.GetOriginal(currentClient));

     

          }

     

          else

     

          {

     

            this.ObjectContext.ClientJeu.AttachAsModified(currentClient);

     

          }

     

          this.ObjectContext.SaveChanges();

     

        }

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 20 juin 2011 06:35
  • Bonjour j'ai testé avec le code que vous me proposer sans succes

    Il passe le premier   if (currentClient.EntityState == EntityState.Detached)

    l'objet n'est donc pas détaché du contexte.

    Ensuite, au moment de l'éxécution du  this.ObjectContext.ClientJeu.AttachAsModified(currentClient);

    il m'indique qu'un objet avec la même clé existe déjà dans le context.

     

    Finalement pour contourner ce problème j'ai fait ceci:

     public void UpdateClient(Client currentClient)

     

        {

    Var q = from c in objectContext.ClientJeu where c.ID = currentClient.ID select c;

    Client client = new Client;

    client  = c.SingleorDefault<Client>();

     //J'ai ensuite attribué toutes les proprietés de mon paramètre currentClient à mon objet client qui provient directement de mon context.

    //j'utilise ensuite votre le code que vous m'avez proposé qui là fonctionne.

          if (currentClient.EntityState == EntityState.Detached)

     

          {

     

            this.ObjectContext.ClientJeu.AttachAsModified(client, this.ChangeSet.GetOriginal(client));

     

          }

     

          else 

     

          {

     

            this.ObjectContext.ClientJeu.AttachAsModified(client);

     

          }

     

          this.ObjectContext.SaveChanges();

     

        }

     

    Je suis convaincu qu'il existe un procédure plus simple, je ne comprends pas pourquoi cela ne marche pas lorsque mon objet est modifié hors de ma méthode.

    Merci Ciprian



    Cédric Yumba
    mercredi 6 juillet 2011 23:53