Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Περίεργο λάθος με Nhibernate

Îåêßíçóå áðü ôï ìÝëïò Chrysostomos Kolovos. Τελευταία δημοσίευση από το μέλος Chrysostomos Kolovos στις 03-06-2011, 15:15. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-05-2011, 14:55 65986

    Περίεργο λάθος με Nhibernate

    Έχω μια εφαρμογή που χρησιμοποιεί nhibernate για το dataaccess, που έχει αρκετούς χρήστες που την χρησιμοποιούν καθημερινά. Το πρόβλημα μου είναι ότι σε μια φόρμα όταν που σκάει ένα περίεργο λάθος. Εγώ προσωπικά δεν έχω καταφέρει ποτέ να αναπαράγω αυτό το λάθος, και αφού κάποιοι χρήστες μου παραπονέθηκαν ότι τους έσκαγε ξαφνικά η εφαρμογή πήρα και είδα το log file που βγάζω. Η κίνηση που κάνουν είναι να πατήσουν το κουμπί της αποθήκευσης. Αυτό το κάνουν πάρα πολλές φορές μέσα στην μέρα και μπορεί να τύχη να τους σκάσει από καμία έως μια δύο φορές. Λοιπόν το λάθος που βγάζω είναι το εξής.

    NHibernate - could not update: [MyNamespace1.MyNamespace2.Eggrafa#47321][SQL: UPDATE Eggrafa SET Field1= ?, Field2= ?, Field3= ?, Field4 = ?,mpla mpla mpla... Field15 = ? WHERE nEggrafaID = ?] 
    Violation of UNIQUE KEY constraint 'IX_Eggrafa'. Cannot insert duplicate key in object 'dbo.Eggrafa'. 
    The statement has been terminated.  

    σε NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    σε NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    σε NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) 
    σε NHibernate.Action.EntityUpdateAction.Execute()
    σε NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
    σε NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 
    σε NHibernate.Engine.ActionQueue.ExecuteActions()
    σε NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 
    σε NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 
    σε NHibernate.Impl.SessionImpl.Flush()
    σε 
    MyNamespace1.MyNamespace2.NHibernateSession.Close()

    Να βάλω και το hbm?
    Πάντως το ID το έχω δηλωμένο έτσι:
    		<id name="Id" column="nEggrafaID">
    			<generator class="native" />
    		</id>
    Καμιά ιδέα?


  •  24-05-2011, 15:41 65987 σε απάντηση της 65986

    Απ: Περίεργο λάθος με Nhibernate

    Παρόλου που η εμπειρία μου είναι περιορισμένη με το nHibernate απο τα λίγα που θυμάμε και ξέρω, υποθέτω ότι το native δεν είναι η καλύτερη επιλογή, αλλά το Identity (εφόσον υποστηρίζεται). Σε διαφορετική περίπτωση, μάλλον ο Hi/Lo algorithm τα σκατώνει και βγάζει duplicate keys, οπότε όταν πολλοί χρήστες ταυτόχρονα πάνε να αποθηκεύσουν στο ίδιο table, τρώνε το exception.  

    Κάτι άλλο που μου έρχεται στο μυαλό, είναι ότι το πεδίο του nEggrafaID να μην είναι δηλωμένο σαν identity έτσι ώστε το native να καταλάβει ότι είναι identity και να υποστηρίξει το generation στην βάση κι όχι me hi/lo.


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  24-05-2011, 17:03 65989 σε απάντηση της 65987

    Απ: Περίεργο λάθος με Nhibernate

    Το insert έχει ήδη γίνει πιο πριν. Αυτό είναι update που τρέχει. Οπότε το λάθος είναι περίεργο για duplicate key στη Βάση. To nEggrafaID είναι identity. Αυτό με το Identity θα το δω τώρα(http://nhforge.org/doc/nh/en/index.html#mapping-declaration-id-generator).

    Ευχαριστώ.


  •  24-05-2011, 19:39 65992 σε απάντηση της 65986

    Απ: Περίεργο λάθος με Nhibernate

    Κι εγώ δεν έχω εμπειρία από nHibernate ("τότε γιατί απαντάς", θα ρωτήσεις). Anyway... Από τα λίγα που καταλαβαίνω, το λάθος συμβαίνει σε insert. Θα συμφωνήσω με τον Παναγιώτη ότι το native ΔΕΝ είναι καλή επιλογή. Η τιμή που παίρνει το ID εξαρτάται από το τι καταλαβαίνει το nHibernate "ερμηνεύοντας" το key generation strategy ανάλογα με το DB Engine που χρησιμοποιείται (είτε identity, είτε sequence π.χ. Oralce, είτε hilo). Για περισσότερες πληροφορίες δες εδώ. Το επόμενο ερώτημα, λοιπόν, είναι ποιο DB Engine χρησιμοποιείς και πως γίνεται το ID generation. Επίσης, καλόν είναι να χρησιμοποιείς Version column, οπότε ρίξε και μια ματιά εδώ. Τέλος, καλό θα ήταν να ρίξεις μια ματιά στο πως αποθηκεύονται τα entities (π.χ. με Save() ή SaveOrUpdate()), αν προηγουμένως έχουν γίνει dettached κλπ (ρίξε μια ματιά κι εδώ). Ελπίζω αυτά που γράφω να βοηθούν και όχι να αποπροσανατολίζουν...

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  26-05-2011, 09:43 66011 σε απάντηση της 65986

    Απ: Περίεργο λάθος με Nhibernate

    Από τη στιγμή που το EggrafaId είναι identity στη βάση θα έπρεπε να το έχεις δηλωμένο έτσι και στο hbm. Πάντως, από τη λίγη εμπειρία που έχω στο NHibernate, μοιάζει όντως περίεργο αυτό που συμβαίνει.
    Το λάθος που σου πετάει είναι του SQL και μου κάνει εντύπωση που παίρνεις ένα τέτοιο λάθος από τη στιγμή που λες ότι η στήλη EggrafaId είναι identity.
    Μήπως δεν είναι; Ή μήπως υπάρχει και κάποιο άλλο περίεργο index στον πίνακα;

    Πάντως εάν όντως είναι identity η στήλη δοκίμασε σε πρώτη φάση να δηλώσεις τον generator ως identity στο hbm.

    Σε δεύτερη φάση, μπορείς να αλλάξεις το configuration του log4net (που χρησιμοποιεί το NHibernate) ώστε να πάρεις περισσότερη πληροφορία μήπως και καταλάβεις καλύτερα τι συμβαίνει. π.χ.:

    <log4net debug="true">
    
        ...
    
        <logger name="NHibernate">
          <level value="DEBUG" />
        </logger>
        <logger name="NHibernate.SQL">
          <level value="DEBUG" />
        </logger>
      </log4net>


  •  03-06-2011, 15:15 66137 σε απάντηση της 66011

    Απ: Περίεργο λάθος με Nhibernate

    Το πρόβλημα λύθηκε. Η εφαρμογή είχε στηθεί με το κώδικα που παράγετε από ένα template του codesmith. Βασικά τα ξήλωσα όλα αυτά και έγγραψα κατευθείαν με τις κλάσσεις του nhibernate χώρις αυτό το layer και το πρόβλημα έφυγε(μαζί με το layer).




Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems