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

NHibernate Discussion :

NHibernate Exceptions GenericADOException


Sujet :

NHibernate

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Points : 59
    Points
    59
    Par défaut NHibernate Exceptions GenericADOException
    Bonjour à tous,

    Je suis en train de modifier le projet NerdDinners afin de pouvoir utiliser NHibernate. Pour le moment je peux créer, modifier. Pour ce qui est de la suppression...impossible. Je comprend pas vraiment le message d'erreur:
    {"could not delete collection: [Core.Domain.Model.Dinners.RSVPs#66][SQL: UPDATE RSVP SET DinnerID = null WHERE DinnerID = @p0]"}
    Il veux mettre à jour la table RSVP alors que je veux qu'il supprime les données!

    Voici le code:
    DinnersRepository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     #region IRepository Delete
            void IRepository<Dinners>.Delete(Dinners entity)
            {
                using (ISession session = NHibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Delete(entity);
                        transaction.Commit();
                    }
                }
            }
            #endregion
    Dinners.hbm.xml
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="Core.Domain.Model"
                       assembly="Core">
     
      <!-- Mappings for class 'Dinners' -->
      <class name="Dinners" table="Dinners">
        <cache usage="read-write"/>
     
        <!-- Identity mapping -->
        <id name="DinnerID" column="DinnerID" type="System.Int32">
          <generator class="identity"/>
        </id>
     
        <property name="Title"/>
        <property name="EventDate"/>
        <property name="Description"/>
        <property name="HostedBy"/>
        <property name="ContactPhone"/>
        <property name="Address"/>
        <property name="Country"/>
        <property name="Latitude"/>
        <property name="Longitude"/>
     
        <!-- One-to-many mapping: RSVP -->
        <bag name="RSVPs" table="RSVP" cascade="all" lazy="false" >
          <key column="DinnerID"/>
          <one-to-many class="RSVP"/>
        </bag>
     
      </class>
    </hibernate-mapping>
    Rsvp.hbm.xml
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="Core.Domain.Model"
                       assembly="Core">
     
      <class name="RSVP" table="RSVP">
     
        <id name="RsvpID">
          <column name="RsvpID" />
          <generator class="native" />
        </id>
     
        <property name="AttendeeName" />
     
        <many-to-one name="Dinner" class="Dinners" column="DinnerID" cascade="all" lazy="false"/>
     
      </class>
     
    </hibernate-mapping>
    DinnersControllers.cs
    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
    39
    40
    41
    42
    43
    44
    45
    46
    //
            //GET:/Dinners/Delete/2
            public ActionResult Delete(int id)
            {
                Dinners dinner = dinnerRepository.GetById(id);
     
                if(dinner.HostedBy!=User.Identity.Name)
                {
                    return View("InvalidOwner");
                }
     
                if (dinner == null)
                {
                    return View("NotFound");
                }
                else
                {
                    return View(dinner);
                }
            }
     
            //
            //POST: /DInners/Delete/2
            [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult Delete(int id, string confirmButton)
            {
                Dinners dinner = dinnerRepository.GetById(id);
                if (dinner.HostedBy != User.Identity.Name)
                {
                    return View("InvalidOwner");
                }
     
                if (dinner == null)
                {
                    return View("NotFound");
                }
                else
                {
                    dinnerRepository.Delete(dinner);
     
                    dinnerRepository.Save(dinner);
     
     
                    return View("Deleted");
                }
            }
    Merci d'avance

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Je pense qu'il essaie de mettre RSVP.DinnerID à NULL parce que sinon la contrainte d'intégrité va empêcher la suppression du Dinner.

    Je maitrise pas très bien NHibernate, mais tu peux toujours essayer de mettre un not-null="true" sur <many-to-one name="Dinner" . Je pense que comme ça il n'essaiera pas de mettre DinnerID à NULL, mais qu'il supprimera les RSVP correspondant au Dinner

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Points : 59
    Points
    59
    Par défaut
    Bonjour Tomlev,

    Merci pour ta réponse, j'ai testé et ça ne fonctionne pas. J'ai été dans le dossier infrstructure pour vérifier le fichier de mapping rsvp et il ne prend pas en compte la modification (not-null=true) donc je suis passé par un éditeur de texte et je l'ai rajouté. Je trouve bizarre que les modifications ne soient pas prise en compte, même en ayant fait un clean et un buid de la solution. Du coup j'ai mis la table RSVP à null et bien sur ça fonctionne.. bon normal sur ce coup là.
    Maintenant j'ai un message d'erreur qui m'explique que le nombre de lignes attendues est de 1 ou 2 (selon le nombre de données enregistrées dans la table) et qu'il en trouve 0, c'est au moment du transaction.commit() que ça se passe.
    Je comprend le message d'erreur, mais je ne sais pas comment remédier à ce problème.

    J'ai vu qu'il fallait faire un rollback après le commit() (session.getTransaction.rollback()) mais c'est pour hibernate et java, avec NHibernate je n'ai pas trouvé. Je vais continuer les recherches.

    Voici le message d'erreur:
    Batch update returned unexpected row count from update; actual row count: 0; expected: 1

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    Non, il applique juste la contrainte de cascade spécifiée dans le mapping du dinner.

    Plus le mélanges de id native et identity, ça se prend les pieds dans le tapis.

    Comme en plus c'est un mapping fait pour un magnifique select n+1, heureusement que ça ne fonctionne pas !

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    plus personne ne connait les bonnes règles de développement SQL de nos jours, et ils voudraient utiliser des ORM, et forcément ne comprennent rien aux erreurs que l'ORM leur retourne.

    C'est triste d'en être arrivé là, surtout qu'on voit les mêmes idioties avec Entity Framework.

    La question a ce poser c'est : sais tu ce qu'est une contrainte d'intégrité (si tu n'a jamais vu, ca ressemble à s'y méprendre à une Foreign Key dans SQL dans ton cas)

    On ne peut pas supprimer une donnée dans une table si celle-ci viole une contrainte d'intégrité relationnelle, en d'autre terme, si une donnée dans une autre table dépend directement de la donnée à supprimer. Pour cela il faudrait tout d'abord faire le ménage dans la table "dépendante" puis faire le ménage dans la table où l'on voulait détruire des entités.

    Encore là tu as de la chance, Entity framework n'aurait pas retourné d'erreur et aurait de lui même supprimé les données dépendantes, mais cela aurait irrémédiablement provoqué d'autres problèmes notamment à cause de ton N+1, et là tu te serais retrouvé dans une situation plutôt épineuse à déboguer... l'absence d'exception ne signifie pas toujours que cela fonctionne comme il faut et comme on voudrait.

  6. #6
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos réponse,

    J'ai résolu le problème, j'ai pas mis les bonnes contraintes (all n'est pas bon pour le fichier RSVP.hbm.xml).
    La question a ce poser c'est : sais tu ce qu'est une contrainte d'intégrité (si tu n'a jamais vu, ca ressemble à s'y méprendre à une Foreign Key dans SQL dans ton cas)
    Faut pas non plus pousser mémé dans les orties!

    NHibernate m'est imposé, j'apprends....donc je fais des conneries et je m'en rend compte. Mais merci pour la critique.

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Points : 59
    Points
    59
    Par défaut
    Bonsoir à tous,

    EN continuant à lire la référence NHibernate + l'aide de B.AF sur un autre post, j'ai pu faire un mapping plus intelligent et pas à la n'importe quoi comme plus haut....no comment's (mais ce doit pas être au top non plus). J'ai donc modifié <generator-class> à identity et non à identity d'un côté et native de l'autre,
    Activé le Lazy-loading et mis la propriété unsaved-value.

    Pour les contraintes d'integrités:
    - rsvps : none
    - dinners :save-update

    et dans le controlleur, j'ai viré dinnerRepository.Save(dinner) ;(pourtant je fume pas ...)

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    N'oublis pas si tu utilise ASP.Net MVC et que donc tu peux potentiellement être en medium trust que le lazy loading et surtout la génération de proxy n'est pas compatible en medium trust.

    C'est à prendre en considération pour toi.

    Il existe 2 Solutions :
    - S'en passer (moi je préconise ça parce qu'au final, ça permet de bien travailler son modéle objet et de faire des objets utiles, mais ça prend du temps)
    - Utiliser le générateur de proxy que tu dois trouver sur la nhforge.

  9. #9
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Points : 59
    Points
    59
    Par défaut
    Merci pour ces infos, je vais me documenter demain ou tout à l'heure. Pour ce qui est du médium trust, je ne sais pas si cela va être utilisé au niveau du projet, mais j'en tiens compte dés à présent, que je me fasse pas avoir...

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] NHibernate Mapping Exception
    Par khadime27 dans le forum C#
    Réponses: 8
    Dernier message: 06/09/2012, 19h18
  2. [NHibernate] Many-To-One génére exception
    Par Baptiste_87 dans le forum NHibernate
    Réponses: 5
    Dernier message: 22/04/2011, 10h02
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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