2011-11-01 21 views
6

मैं परियोजना लिख ​​रहा हूँ और NHibernate 3.1NHibernate क्यों "StaleObjectStateException" फेंक देता है?

SimpleTest का उपयोग कर:

Forum forum = Session.CreateCriteria<Forum>().Add(Restrictions.Eq("UrlName", "reportabug")).UniqueResult<Forum>(); 
forum.TopicsCount++; 
IForumRepository forumRepository = new ForumRepository(SessionFactory); 
forumRepository.Update(forum); 

public virtual void Update(TEntity entity) 
{ 
    if (!session.Transaction.IsActive) 
    { 
     TResult result; 
     using (var tx = session.BeginTransaction()) 
     { 
      session.SaveOrUpdate(entity) 
      tx.Commit(); 
     } 
     return result; 
    } 
    session.SaveOrUpdate(entity) 
} 

अंतिम अद्यतन अपवाद फेंकता है:

StaleObjectStateException was unhandled by user code: 
    Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 

SQL क्वेरी:

UPDATE Forums 
SET Name = 'Forums Issues (not product support)' /* @p0 */, 
     UrlName = 'reportabug' /* @p1 */, 
     Description = 'Use this forum to report issues with the online forums application. When reporting an issue please include relevant details such as repro steps, error messages and browser version.' /* @p2 */, 
     CategoryId = 'b2cc232c-0d5c-4f35-bb6f-29c67d7d40c2' /* @p3 */, 
     TopicsCount = 1 /* @p4 */ 
WHERE ForumId = '864046b7-ca57-48c4-8a81-082103223527' /* @p5 */ 

ForumId सही है। शायद यह समवर्ती है? कोई विचार है?

+0

@ManuPK, अपवाद को लाइन tx.Commit() पर फेंक दिया गया है; –

उत्तर

5

StaleObjectStateException एपीआई here को डेटा स्थिरता सुनिश्चित करने के लिए हाइबरनेट का एक तरीका है। Hibernate version ऑब्जेक्ट्स को अद्यतन करता है जो अद्यतन करता है और यदि डीबी में संस्करण और स्मृति में मेल नहीं खाता है तो एक त्रुटि फेंक देगी। आशावादी लॉकिंग तंत्र here के बारे में और पढ़ें।

तो, इस जानकारी के साथ आवेदन डीबग करें। मैं C# सिंटैक्स से परिचित नहीं हूं लेकिन मुझे लगता है कि दूसरी बचत else स्थिति में होनी चाहिए।

+0

सही है, मैं पूरी तरह से याद किया कि: पी +1। @Kovpaev - अंतिम 'सत्र हटाएं। SaveOrUpdate (इकाई)', इसके लिए कोई आवश्यकता नहीं है। –

+0

@Ash Burlaczenko, विधि के अंत में कॉल करें यदि बाहरी लेनदेन के संदर्भ में विधि अद्यतन() लागू किया गया है। यदि नहीं, तो यह ब्लॉक "if" में बनाया गया है। –

संबंधित मुद्दे