2009-11-30 12 views
8

मैं .NET 3.5, NHibernate के तहत एक एएसपी.नेट एमवीसी वेब ऐप विकसित कर रहा हूं और विंडोज़ एज़ूर पर होस्ट किया गया हूं। जब, वेबपैप स्थानीय विकास कपड़े से चलाया जाता है तो यह ठीक काम करता है। फिर भी, जब मैं इसे विंडोज एज़ूर में ले जाता हूं, तो एमवीसी वेब भूमिका से किए गए प्रत्येक सम्मिलन नीचे सूचीबद्ध अपवाद के साथ समाप्त होता है।अपवाद के बाद सत्र को फ्लश न करें - NHibernate

कोई विचार मेरे एनएचबीर्नेट तर्क के साथ क्या गलत है? (सत्र प्रबंधन हो सकता है, यकीन नहीं)

[AssertionFailure: Lokad.Translate.Entities.User प्रविष्टि में अशक्त आईडी (सत्र फ्लश नहीं है एक अपवाद तब होता है के बाद)] NHibernate.Event.Default। DefaultFlushEntityEventListener.CheckId (वस्तु obj, IEntityPersister persister, वस्तु आईडी, entityMode entityMode) 292 NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues ​​(वस्तु इकाई, EntityEntry प्रविष्टि, entityMode entityMode, बूलियन mightBeDirty, ISessionImplementor सत्र) +93 NHibernate.Event .Default.DefaultFlushEntityEventListener.OnFlushEntity (FlushEntityEvent ईवेंट) +158 NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities (FlushEvent ईवेंट) +469 NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions (FlushEvent घटना) 339 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent घटना) 85 NHibernate.Impl.SessionImpl.Flush() 275 NHibernate.Transaction.AdoTransaction .Commit() +236 Lokad.Translate.Repositories.PageRepository.Create (पृष्ठ पेज) Lokad.Translate.Controllers.PagesController.Create (पृष्ठ पेज) lambda_method (ExecutionScope, ControllerBase, वस्तु []) +69 प्रणाली। Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext नियंत्रक कॉन्टेक्स्ट, IDictionary 2 parameters) +251 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 पैरामीटर) +31 System.Web.Mvc। <> c__DisplayClassa.b__7() +88 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (IActionFilter फिल्टर, ActionExecutingContext preContext, समारोह 1 continuation) +534 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList 1 फिल्टर, ActionDescriptor actionDescriptor, IDictionary`2 पैरामीटर) 312 System.Web.Mvc.ControllerActionInvoker। InvokeAction (ControllerContext controllerContext, स्ट्रिंग actionName) 856 System.Web.Mvc.Controller.ExecuteCore() 185 System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase HttpContext) +221 System.Web.CallHandlerExecutionStep.System.Web .HttpAplication.IExecutionStep.Execute() +586 सिस्टम.Web.HttpAplication.ExecuteStep (IExecutionStep चरण, बूलियन & पूर्ण सिंक्रनाइज़) +177

ध्यान दें कि मैं _session.FlushMode = FlushMode.Commit; उपयोग कर रहा हूँ और उस User एक कस्टम RoleProvider

public class SimpleRoleProvider : RoleProvider 
{ 
    readonly UserRepository Users = new UserRepository(); 

    public override string[] GetRolesForUser(string username) 
    { 
     try 
     { 
      var user = Users.Get(username); 

      // no role if user is not registered 
      if (null == user) return new string[0]; 

      // default role for registered user 
      return user.IsManager ? new[] { "Manager", "User" } : new[] { "User" }; 
     } 
     catch (Exception) 
     { 
      // role should not fail in case of DB issue. 
      return new string[0]; 
     } 
    } 
} 

उत्तर

4

मुझे अंत में अपनी समस्या का समाधान मिला है। यदि लोग रुचि रखते हैं, तो मैं यहां समाधान पोस्ट कर रहा हूं।

public class SimpleRoleProvider : RoleProvider 
{ 
    // isolated session management for the RoleProvider to avoid 
    // issues with automated management of session lifecycle. 

    public override string[] GetRolesForUser(string username) 
    { 
     using (var session = GlobalSetup.SessionFactory.OpenSession()) 
     { 
      var users = new UserRepository(session); 
      var user = users.Get(username); 

      // no role if user is not registered 
      if (null == user) return new string[0]; 

      // default role for registered user 
      return user.IsManager ? new[] {"Manager", "User"} : new[] {"User"}; 
     } 
    } 
} 

असल में क्या हो रहा था कि RoleProvider भंडार नियमित में देखें/में नियंत्रक खजाने से ही जीवन चक्र है प्रतीत नहीं होता है। नतीजतन, उस समय रोलप्रोवाइडर को बुलाया जाता है, एनएचबीर्नेट सत्र पहले से ही ऊपर दिए गए अपवाद के कारण निपटान कर दिया गया है।

मैंने उपर्युक्त निम्नलिखित में कोड को प्रतिस्थापित कर दिया है। इसका अपना एनएचबीर्नेट सत्र प्रबंधन है, और ठीक काम कर रहा है।

18

में प्रयोग किया जाता है आप अपवादों को पकड़ने और एक NHibernate लेनदेन के दौरान उन्हें अनदेखा नहीं किया जाना चाहिए।

मैं समझाने की कोशिश क्यों करता हूं।

डेटाबेस में बाधाओं के कारण उदाहरण के लिए अपवाद हो सकते हैं। (यह मैपिंग समस्याओं, गुणों या किसी अन्य चीज़ द्वारा फेंकने वाले अपवादों के कारण भी हो सकता है।) NHibernate डेटाबेस के साथ स्मृति में राज्य को सिंक्रनाइज़ करने का प्रयास करता है। यह प्रतिबद्धता पर किया जाता है - और कभी-कभी यह सुनिश्चित करने के लिए प्रश्नों से पहले कि वास्तविक डेटा पर प्रश्न किए जाते हैं। जब यह सिंक्रनाइज़ेशन विफल हो जाता है, डेटाबेस में स्थिति कुछ यादृच्छिक है, कुछ बदलाव जारी हैं, अन्य नहीं हैं। इस तरह के मामले में एकमात्र चीज आप कर सकते हैं सत्र बंद कर रहा है।

ध्यान दें कि आपके कोड में निर्णय और गणना स्मृति में मानों पर आधारित हैं। लेकिन - एक अनदेखा अपवाद के मामले में, यह मान डेटाबेस में मान नहीं हैं, वे कभी भी वहां नहीं होंगे। तो आपका तर्क 'फंतासी-डेटा' पर निर्णय और गणना करेगा।

वैसे, किसी भी अपवाद (untyped) को पकड़ना और उन्हें को अनदेखा करना कभी अच्छा विचार नहीं है। आपको हमेशा उन अपवादों को जानना चाहिए जिन्हें आप संभालते हैं, और सुनिश्चित करें कि आप जारी रख सकते हैं।

आप यहां क्या कर रहे हैं प्रोग्रामिंग त्रुटियों को निगल रहा है। मेरा विश्वास करो, प्रणाली अधिक स्थिर नहीं होगी। प्रश्न केवल तभी है: जब आप ऐसा करते हैं तो त्रुटि को देखते हैं, या आप इसे अनदेखा करते हैं और यहां तक ​​कि त्रुटि के परिणाम डेटाबेस पर जारी रखते हैं? जब आप उत्तरार्द्ध करते हैं, तो आपको आश्चर्यचकित नहीं होना चाहिए कि आपका डेटाबेस असंगत है और जब आप डेटाबेस से डेटा प्राप्त करने का प्रयास करते हैं तो अन्य त्रुटि उत्पन्न होती है। और आपको उस कोड को कभी भी नहीं मिलेगा जो त्रुटि का वास्तविक कारण है।

+0

हाय स्टीफन, बहुत बहुत शुक्रिया। मुझे अंततः एक समाधान मिला है। समस्या आपके स्पष्टीकरण से असंबंधित थी, लेकिन फिर भी यह अभी भी एक महान बिंदु है। –

+0

इतने विस्तृत स्पष्टीकरण के लिए आपको बहुत बहुत धन्यवाद, मुझे एक ही त्रुटि थी और यह NHibernate अपवाद को निगलने के कारण हुआ था। मैंने आपकी पोस्ट पढ़कर बहुत समय बचाया। – Vladimirs

0

यह अपवाद अपने विस्तृत विवरण के लिए हो सकता है यदि आपके स्तंभ नाम आरक्षित शब्द शामिल हैं (एक स्तंभ नाम के रूप में उदाहरण के लिए उपयोग की स्थिति और इसे सहेजें करने के लिए असंभव हो जाएगा)

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