आपको वर्तमान ApplicationUser के लिए सीधे डेटाबेस को क्वेरी करने की आवश्यकता नहीं होनी चाहिए।
यह शुरुआत के लिए एक अतिरिक्त संदर्भ होने की एक नई निर्भरता का परिचय देता है, लेकिन आगे जाकर उपयोगकर्ता डेटाबेस तालिकाओं में परिवर्तन होता है (पिछले 2 वर्षों में 3 बार) लेकिन एपीआई सुसंगत है। उदाहरण के लिए users
तालिका को अब AspNetUsers
आइडेंटिटी फ्रेमवर्क में कहा जाता है, और कई प्राथमिक कुंजी फ़ील्ड के नाम बदलते रहते हैं, इसलिए कई उत्तरों में कोड अब के रूप में काम नहीं करेगा ।
एक अन्य समस्या यह है कि डेटाबेस में अंतर्निहित OWIN एक्सेस एक अलग संदर्भ का उपयोग करेगा, इसलिए अलग SQL एक्सेस से परिवर्तन अमान्य परिणाम उत्पन्न कर सकते हैं (उदाहरण के लिए डेटाबेस में किए गए परिवर्तन नहीं देख रहे हैं)। फिर से समाधान आपूर्ति की गई एपीआई के साथ काम करना है और इसके आसपास काम करने की कोशिश न करें ।
ASP.Net पहचान (वर्तमान तिथि के अनुसार) में वर्तमान उपयोगकर्ता ऑब्जेक्ट तक पहुंचने का सही तरीका है:
var user = UserManager.FindById(User.Identity.GetUserId());
या, यदि आपके पास एक async कार्रवाई है, तो कुछ इस तरह है:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
आवश्यकता है कि आपको निम्नलिखित कथन का उपयोग करना चाहिए ताकि गैर-एस्किंस UserManager
विधियाँ उपलब्ध हों (वे UserManager के लिए विस्तार विधियाँ हैं , इसलिए यदि आप इसे शामिल नहीं करते हैं तो आप केवल देखेंगे FindByIdAsync
):
using Microsoft.AspNet.Identity;
यदि आप किसी कंट्रोलर में नहीं हैं (जैसे आप आईओसी इंजेक्शन का उपयोग कर रहे हैं), तो उपयोगकर्ता आईडी को इसमें से पूरी तरह से लिया गया है:
System.Web.HttpContext.Current.User.Identity.GetUserId();
यदि आप मानक खाता नियंत्रक में नहीं हैं, तो आपको अपने नियंत्रक में निम्नलिखित (उदाहरण के रूप में) जोड़ने की आवश्यकता होगी:
1. इन दोनों गुणों को जोड़ें:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. नियंत्रक के निर्माता में इसे जोड़ें:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
मार्च 2015 को अपडेट करें
नोट: पहचान फ्रेमवर्क के लिए सबसे हालिया अपडेट प्रमाणीकरण के लिए उपयोग किए गए अंतर्निहित वर्गों में से एक को बदलता है। अब आप इसे मौजूदा HttpContent के ओवेन कॉनटेक्स्ट से एक्सेस कर सकते हैं।
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
परिशिष्ट:
दूरस्थ डेटाबेस कनेक्शन पर Azure के साथ EF और आइडेंटिटी फ्रेमवर्क का उपयोग करते समय, (Azure डेटाबेस में स्थानीय होस्ट परीक्षण जैसे), आप बेतरतीब ढंग से खतरनाक "त्रुटि: 19 - शारीरिक कनेक्शन उपयोग करने योग्य नहीं है" को हिट कर सकते हैं। जैसा कि कारण पहचान फ्रेमवर्क के अंदर दफन है, जहां आप रिट्रीस नहीं जोड़ सकते हैं (या जो एक लापता प्रतीत होता है .Include(x->someTable)
), आपको SqlAzureExecutionStrategy
अपनी परियोजना में एक कस्टम लागू करने की आवश्यकता है ।