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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 : 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
    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 confirmé
    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
    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 extrêmement actif
    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
    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 Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    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 confirmé
    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
    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.

+ 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