IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[EF] Problème avec SaveChanges()


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut [EF] Problème avec SaveChanges()
    Bonsoir

    Bon j'ai un soucis avec mon client lourd C# qui utilise un WebDataService (Astoria + ADO) pour requêter & écrire dans une BDD...

    Pour la lecture, pas de soucis, LinQ is powaful !

    Par contre lorsque je veux ajouter une nouvelle entrée en utilisant Entites.AddToMATABLE(), et qu'aprés je fais un SaveChanges(), j'ai une exception pas vraiment parlante qui est générée...



    J'ai testé à partir d'un projet vierge, sans utiliser de WebDataService, avec un .edmx tout propre, et ça marche...

    Du coup j'ai tenté d'ajouter quelques lignes dans la classe WebDataService :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            // This method is called only once to initialize service-wide policies.
            public static void InitializeService(IDataServiceConfiguration config)
            {
                // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
                // Examples:
                config.SetEntitySetAccessRule("*", EntitySetRights.All);
                config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            }
    Rien y fait... je comprends pas et j'ai besoin d'aide
    Si vous avez une idée, n'hésitez pas !

    merci d'avance !

    Enjoy !

  2. #2
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut Stack Trace
    Et voici le stack trace si ça peut vous aider

    à System.Data.Services.Client.DataServiceContext.SaveAsyncResult.HandleBatchResponse()
    à System.Data.Services.Client.DataServiceContext.SaveAsyncResult.EndRequest()
    à System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
    à System.Data.Services.Client.DataServiceContext.SaveChanges()
    à ManagerLayer.MainManager.AddCoursInDatabase(Cours c) dans C:\Users\...\ManagerLayer\Manager.cs:ligne 223
    à TestRibbon3.Window1.RibDB_Executed(Object sender, ExecutedRoutedEventArgs e) dans C:\Users\...\PresentationLayer\MainWindow.xaml.cs:ligne 990

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    dans le dialogue de l'exception, clique sur "afficher les détails", et regarde la InnerException, ce sera peut-être plus parlant...

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    plop !

    merci pour ta réponse ! voilà ce que j'ai dans le InnerException...


    Apparemment ça vient de MoveNext(), mais là encore j'sais pas vraiment ce que c'est...

    J'vais tenter quelques recherches avec le StatusCode 500, on verra bien

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par h0pelessS Voir le message
    J'vais tenter quelques recherches avec le StatusCode 500, on verra bien
    Ca t'apprendra pas grand chose... c'est un code générique HTTP d'erreur interne du serveur

    Sinon, tu peux montrer ce qu'il y a dans le XML du message de la InnerException ?

  6. #6
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <code></code>
    <message xml:lang="fr-FR">Une erreur s'est produite lors du traitement de cette requête.</message>
    </error>

    Je pense que c'est tout ce qu'il y a

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    Bon c'est vraiment bizarre !

    Je pense que le problème viendrait plus particulièrement de AddToMATABLE() puisque j'arrive à faire des UpdateObject(MATABLE monObj) avec un SaveChanges() qui suit sans aucun problème...

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut
    J'ai eu le problème avec une date not null qui a pour valeur par défaut getdate()... mais qui EF me refusait en amont j'ai du l'initialiser.

    Le message ressemblait à ça je crois.

  9. #9
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    Aprés moulte recherches, j'ai remarqué que l'exception était levée uniquement lorsque je tentais d'ajouter une entité liée à d'autres entités via une clé étrangère...

    Voilà un p'tit modèle simplifié de ma BDD :



    Voilà le code que j'écris pour ajouter une entité de type cours :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // Déclaration de l'entité avec l'uri du service
    Uri wsUri = new Uri("http://localhost:50602/WebDataService.svc/");
    Entities entity = new Entities(wsUri);
     
    // Je chope la matiere associée au nouveau cours
    MATIERE m = (from mat in entity.MATIERE select mat).First() as MATIERE;
     
    // Je chope la promo associée au nouveau cours
    PROMO p = (from pro in entity.PROMO select pro).First() as PROMO;
     
    // J'affecte
    COURS cs = new COURS();
    cs.HORAIRE_DEBUT = DateTime.Now;
    cs.HORAIRE_FIN = DateTime.Now.AddHours(2);
    cs.NOM = "NOUVEAU COURS";
    cs.PROMO = p;
    cs.MATIERE = m;
     
    entity.AddToCOURS(cs);
     
    // BOUM ! Exception bizarre !
    entity.SaveChanges();
    Si vous avec un exemple concret d'ajout d'entité avec des clé étrangères via EntityFramework, je suis preneur

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut
    J'ai bien un cas tout simple une table OFFRE immobilieres avec une fk sur la nature de l'offre (id/lib).

    le code d'enregistrement est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
                //Création Offre
                Offre ofr = new Offre();
                ofr.DateCreation = DateTime.Now;
                ofr.NomContact = txtNom.Text;
                //Nature de l'offre (depuis combo)
                ofr.NatureReference.EntityKey = new EntityKey("ImmoContainer.Nature", "IdNat", Int32.Parse(cbNature.SelectedValue));
                //Encore plein de champs...
     
                // on pousse le luxe jusqu'à enregistrer des photos
                if (Session["CurrentPhotos"] != null)
                {
                    classeurPhoto cl = (classeurPhoto)Session["CurrentPhotos"];
                    foreach (var p in cl.liste())
                    {
                        ImmoAnnonce.Photo pEntity = new ImmoAnnonce.Photo();
                        string name;
                        FileInfo fi = new FileInfo(p.PhotoPath);
                        name = Server.MapPath("~/photos/") + fi.Name;
                        System.IO.File.Copy(p.PhotoPath , name);
                        pEntity.PhotoURL = name;
                        ofr.Photo.Add(pEntity);
                    }
                }
     
                //Enregistrement
                try
                {
                    ImmoContainer bdd = new ImmoContainer();
                    bdd.AddToOffre(ofr);
                    bdd.SaveChanges();
                }
                catch (Exception Ex)
                {
                    lblErreur.Visible = true;
                    lblErreur.Text = "Une erreur s'est produite : " + Ex.Message ;
                    return;
                }
    Pas très différent mais j'ai utilisé NatureReference.EntityKey = new EntityKey ceci dit il me semble que lors d'un premier essai j'avais fait la même chose que toi avec succés.

  11. #11
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    Merci pour ta réponse ^^

    Le soucis c'est que j'utilise un WebService pour consommer les données de ma base...

    Du coup les entités générées par mon Service ne sont pas vraiment les même que celles générées par le modèle EDMX dans lesquelles on peut trouver les propriétés EntityKey & Reference...

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut
    Certes...

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo