5

समस्या। एक पंजीकरण परिदृश्य में, मैं अपने उपयोगकर्ता तालिका में एक उपयोगकर्ता डालने की कोशिश कर रहा हूं और उसके बाद उस उपयोगकर्ता (लेनदेन में) के लिए WebSercurity.CreateAccount पर कॉल करें। इससे त्रुटि होती है कि सर्वर पर एमएस डीटीसी उपलब्ध नहीं है।एक TrasactionScope में अन्य प्रश्नों के साथ WebSercurity.CreateAccount का उपयोग कर, डीटीसी के बिना सक्षम

विवरण। कारण यह है कि मैं ऐसा कर रहा हूं क्योंकि मेरे पास Customer इकाई है जो User से प्राप्त होती है, इसलिए WebSercurity.CreateUserAndAccount का उपयोग नहीं किया जा सकता क्योंकि यह Customer के बारे में नहीं जानता है और केवल User रिकॉर्ड दर्ज करता है।

मैं Asp.net MVC 4 का उपयोग कर रहा EntityFramework 5, CodeFirst, और SQL सर्वर 2008 R2 के साथ।

डीटीसी का उपयोग न करने के लिए कोई सुझाव की सराहना की जाएगी!

संपादित करें। यह कारण है कि इस त्रुटि तब होती है स्पष्ट है क्योंकि websecurity डेटाबेस के लिए अपने स्वयं के कनेक्शन का उपयोग करता है, और मेरी खजाने, एक और कनेक्शन का उपयोग हालांकि मैं अपने खजाने के रूप में ही DbContext वर्ग का उपयोग करने के simplemembership कॉन्फ़िगर कर दिया है, लेकिन समस्या यह है कि यह एक बनाता है DbContext का नया उदाहरण ...

मैं उम्मीद कर रहा था कि मौजूदा संदर्भ ऑब्जेक्ट को पास करने का कोई तरीका है या WebSecurity से इसके तरीकों का उपयोग करने के लिए कनेक्शन है।

 if (ModelState.IsValid) 
     { 
      //using (TransactionScope tx = new TransactionScope()) 
      //{ 
       UnitOfWork.UserRepository.Insert(new Customer 
       { 
        FirstName = model.FirstName, 
        LastName = model.LastName, 
        Email = model.Email, 
        Tel = model.Tel, 
        Mobile = model.Mobile, 
        BirthDate = model.BirthDate, 
        InsertDate = DateTime.Now, 
        UserType = UserType.Customer, 
        MaritalStatus = model.MaritalStatus, 
        ZipCode = model.ZipCode, 
        StreetAddress = model.StreetAddress, 
        City = model.City, 
        State = model.State 
       }); 
       UnitOfWork.Commit(); 

       string token = WebSecurity.CreateAccount(model.Email, model.Password, true); 

       Roles.AddUserToRole(model.Email, "Customer"); 
       //WebSecurity.Login(model.Email, model.Password, true); 

       await Task.Run(() => EmailHelper.SendConfrimationEmail(token, model.Email)); 

      // tx.Complete(); 
      //} 

उत्तर

1

मुझे संभावित समाधान मिला लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है या नहीं। यह विचार blog post से आया है जो कहता है कि हम अपने पॉको इकाइयों में सरलमेम्बरशिप टेबल कैसे शामिल कर सकते हैं और खुद को टेबल बना सकते हैं (वेब ​​सुरक्षा का उपयोग नहीं कर रहे हैं)।

तो एक परिणाम के रूप मुझे लगता है कि मैं बस webpages_UsersInRoles तालिका में एक रिकॉर्ड डालने से webpages_Membership तालिका में एक रिकार्ड है, और AddUserToRole डालने से मेरी खजाने में CreateAccount विधि लागू कर सकते हैं। अन्य प्रश्नों के लिए GetUser और ... हम WebSecurity और Roles कक्षा का उपयोग पहले की तरह कर सकते हैं।

यह काम करने के लिए ठीक है (अन्यथा मैं कुछ याद कर रहा हूँ) लगता है, लेकिन जो मैं करने के लिए नहीं चाहते हैं क्या करने के लिए कुछ अतिरिक्त काम है!

तो यदि कोई मुझे बेहतर समाधान दे सकता है तो मुझे खुशी होगी।

1

डीटीसी त्रुटि तब होती है क्योंकि आप दो अलग अलग डेटाबेस कनेक्शन पर एक सौदे अवधि की कोशिश कर रहे:

यहाँ कोड है। आपके पास कई विकल्प हैं।

सरलमेम्बरशिप सरल परिदृश्यों के लिए डिज़ाइन किया गया है। आप एक उन्नत परिदृश्य कर रहे हैं, इसलिए आपको शायद एक अलग सदस्यता प्रदाता का उपयोग करना चाहिए।

+0

धन्यवाद, हां, मुझे पता है, 'वेब सुरक्षा' विधियों से कनेक्शन पारित करने का कोई तरीका नहीं है? आप किस सदस्यता प्रदाता का सुझाव देते हैं? – Ashkan

0

गुप्त मैन के रूप में क्योंकि लेन-देन दो अलग डेटाबेस खत्म हो गया है त्रुटि हो रहा है ने कहा। आपके पास कई विकल्प हैं। यहां कुछ ऐसे हैं जो दिमाग में आते हैं।

आप प्रत्येक उपयोगकर्ता के लिए इच्छित कस्टम जानकारी को कैप्चर करने के लिए SimpleMembership प्रदाता द्वारा उपयोग की गई मौजूदा उपयोगकर्ता इकाई को कस्टमाइज़ कर सकते हैं। यह काफी सरल है और discussed in this blog post है।ऐसा लगता है कि आप एक ईमेल पुष्टिकरण करने की कोशिश कर रहे हैं जो SimpleMembership प्रदाता भी समर्थन करता है और discussed here है।

आप सरल उपयोगकर्ता आईडी (int) के साथ अपने अन्य डेटाबेस में जानकारी को भी जोड़ सकते हैं जो SimpleMembership का उपयोग करता है। एक बार जब आप उपयोगकर्ता बनाते हैं और उन्हें लॉग इन करते हैं तो WebSecurity.CurrentUserId पर कॉल करके वह आईडी प्राप्त कर सकते हैं।

आप पूरे SimpleMempership प्रदाता को बाईपास कर सकते हैं और अपना खुद का कस्टम सदस्यता प्रदाता बना सकते हैं, जो discussed here है।

+0

उत्तर के लिए धन्यवाद। ** विकल्प 1 ** के बारे में: मैं बिल्कुल इस दृष्टिकोण का उपयोग कर रहा हूं। मेरी 'उपयोगकर्ता' इकाई की कस्टम जानकारी है जो मुझे चाहिए, मेरी समस्या यह है कि मेरे पास 2 प्रकार के उपयोगकर्ता हैं: ग्राहक और एजेंट चुड़ैल उपयोगकर्ता को विरासत में मिला है! ** विकल्प 2 ** के बारे में: मैं यह भी कर रहा हूं! मेरी समस्या कुछ और है (या मुझे तुम्हारा मुद्दा नहीं मिला!)। लेकिन लिंक में कुछ उपयोगी जानकारी थी। धन्यवाद। और लगभग ** विकल्प 3 **: मैं पहिया को फिर से शुरू नहीं करना चाहता हूं। – Ashkan

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

  • कोई संबंधित समस्या नहीं^_^