24

मैंने एक नया एएसपी.नेट एमवीसी 4 एप्लीकेशन बनाया है, और इसे पहले कोड का उपयोग करना चाहते हैं। हालांकि यह प्रारंभ में डेटाबेस फ़ाइल बनाने के लिए प्रतीत नहीं होता है अगर यह पहले से मौजूद नहीं है। अगर मैं App_Data फ़ोल्डर से .mdf फ़ाइल को नष्ट, तो मैं निम्नलिखित अपवाद है जब अनुप्रयोग डेटाबेस का उपयोग करने की कोशिश करता है: डीबगर में अनुप्रयोग में अगर मैं इसे चलानेअपवाद जब पहली बार डेटाबेस बनाने के लिए डेटाबेस

System.Data.SqlClient.SqlException: Cannot attach the file '<path-to-db-file>.mdf' as database '<my-db-file-name>'. 

, तो मैं देख सकता हूँ कि LazyInitializer.EnsureInitialized को कॉल करते समय InitializeSimpleMembershipAttribute :: OnActionExecuting विधि में अपवाद हो रहा है। पकड़ा अपवाद है:

[System.Reflection.TargetInvocationException] {"Exception has been thrown by the target of an invocation."} System.Reflection.TargetInvocationException 
की एक आंतरिक अपवाद के साथ

:

[System.InvalidOperationException] {"The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588"} System.InvalidOperationException 

कौन सा तो पहले अपवाद मुझे लगता है कि के भीतरी अपवाद के रूप में ऊपर उल्लेख किया है।

कोई विचार क्या मैं गलत कर रहा हूं?

अद्यतन

मैं सिर्फ एक ब्रांड के नए MVC4 अनुप्रयोग के साथ यह कोशिश की है। मैं इसे निम्नलिखित करके दोहराना कर सकता हूं:

  1. वीएस विज़ार्ड में एमवीसी ऐप बनाएं।
  2. पहली बार ऐप चलाएं और लॉगिन पेज पर जाएं (नोट करें कि एमडीएफ फ़ाइल अब उत्पन्न हो गई है)।
  3. एमडीएफ फ़ाइल हटाएं, और लॉगिन पेज पर वापस जाएं। अपवाद अब फेंक दिया गया है।
+7

क्या आपको कभी यह पता चला है? – Eonasdan

+0

@ एओनासदान, एक साल बाद, हां। कृपया मेरा जवाब देखें। – joelmdev

उत्तर

0

आपको अपने IISExpress इंस्टेंस को रोकना होगा और इसे फिर से शुरू करना होगा (अपने विजुअल स्टूडियो में F5 दबाकर)। फिर आप डेटाबेस को फिर से बनाने में सक्षम होंगे।

2

आप अपने प्रोजेक्ट के रूट फ़ोल्डर में Global.asax फ़ाइल के Application_Start विधि में कोड पहले डेटाबेस प्रारंभ संभाल कर सकते हैं, जैसे निम्नलिखित:

protected void Application_Start() 
    { 
     Database.SetInitializer<MyDBContext>(null); 
    } 

आप SetInitializer करने के लिए इसे नहीं बनाएगा अशक्त पार कर लेते हैं या अपनी डेटाबेस टेबल को बदलें, आपको इसे मैन्युअल रूप से करना चाहिए।

डेटाबेस पुन: उत्पन्न नहीं होने का कारण यह है कि एप्लिकेशन_स्टार्ट एप्लिकेशन जीवनकाल के दौरान केवल एक बार निकाल दिया जाता है।

+1

यह अब एमवीसी 4 में सबसे अच्छा अभ्यास नहीं है। इसके बजाय App_Start फ़ोल्डर में कक्षाओं का उपयोग करें। – kingdango

2

एमवीसी-जेनरेट कोड "डिफ़ॉल्ट कनेक्शन" नामक डेटाबेस कनेक्शन स्ट्रिंग के साथ काम करता है।

  1. InitializeSimpleMembershipAttribute.SimpleMembershipInitializer.ctor() InitializeSimpleMembershipAttribute.cs में): यदि आप Web.config में एक अलग नाम का इस्तेमाल किया हैं, तो आप में इस नाम का उल्लेख करने की जरूरत है।
  2. UsersContext.ctor() AccountModel.cs
  3. में

(या बस अपनी परियोजना में "DefaultConnection" के लिए खोज)।

1

आपको कभी भी SQL प्रबंधन टूल या ऑब्जेक्ट एक्सप्लोरर के माध्यम से एक्सप्लोरर में स्वत: संक्रमित .mdf फ़ाइलों को हटा नहीं देना चाहिए।

जो समस्या आप प्राप्त कर रहे हैं (और आपके द्वारा प्रदान किए गए चरणों में दोहराना कर सकते हैं) यह है कि डेटाबेस अभी भी स्थानीय डीबी में पंजीकृत है।

+0

लोकलडीबी डाटाबेस को फाइल के रूप में समर्थन देता है, इसलिए यह जरूरी नहीं है। Http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx – joelmdev

4

आप अपने आवेदन के InitializeSimpleMembershipAttribute वर्ग में खुदाई यदि आप ActionFilterAttribute वर्ग जिसमें से यह विरासत के निम्नलिखित ओवरराइड विधि देखेंगे:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Ensure ASP.NET Simple Membership is initialized only once per app start 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
    } 

ध्यान दें कि टिप्पणी। आवेदन यह सुनिश्चित करने के लिए प्रति रन एक बार जांच रहा है कि सरल सदस्यता ठीक से शुरू की गई है। वर्ग के शीर्ष पर निजी चर को देखो:

private static SimpleMembershipInitializer _initializer; 
    private static object _initializerLock = new object(); 
    private static bool _isInitialized; 

वे सब स्थिर हैं और वे सभी refs के रूप में पारित कर रहे हैं। आपकी स्थिति के लिए यहां महत्वपूर्ण महत्वपूर्ण _isInitialized है। क्या LazyInitializer.EnsureInitialized करता है _isInitialized ध्वज की जांच करता है और यदि यह गलत है तो यह पारित होने वाले रेफरी लक्ष्य को प्रारंभ करता है, इस मामले में _initializer प्रकार SimpleMembershipInitializer टाइप करें। उस बिंदु पर यह ध्वज को सत्य पर सेट करता है और आगे बढ़ता है। यदि LazyInitializer.EnsureInitialized देखता है कि ध्वज सत्य है तो यह लक्ष्य को वापस करने के अलावा कुछ भी नहीं करता है। चूंकि वह ध्वज एक स्थैतिक चर है, यह एप्लिकेशन के जीवन के लिए अपना मूल्य बना रहता है जिसका अर्थ है कि उस पहले प्रारंभिकरण के बाद सुनिश्चित करें कि डेटाबेस फ़ाइल अब मौजूद नहीं होने पर भी लक्ष्य को वापस कर देगा। दूसरे शब्दों में, यदि आप प्रारंभ करने के बाद .mdf फ़ाइल को हटाते हैं तो एप्लिकेशन नहीं पता होगा और जब ऐप डेटाबेस से पढ़ने या लिखने का प्रयास करता है तो अपवाद फेंक दिया जाएगा। इसे हल करने के लिए आपको एप्लिकेशन को पुनरारंभ करना होगा, जिसका मतलब है कि यदि आप आईआईएस में एप्लिकेशन का उपयोग कर रहे हैं या फिर से शुरू कर रहे हैं तो देव सर्वर को मारना।

तो यही समस्या है जिसका आप सामना कर रहे हैं, लेकिन मुझे संदेह है कि इस प्रश्न में चल रहे कई लोगों के पास एक समान लेकिन अलग-अलग समस्या है जहां उन्हें लॉग इन करने का प्रयास करते समय इस तरह के एक त्रुटि संदेश प्राप्त होता है:

': \ करने के लिए अपने \ परियोजना \ App_Data \ dbfile.mdf \ पथ \ सी'

फ़ाइल बनाने का सामना करना पड़ा ऑपरेटिंग सिस्टम त्रुटि 5 (प्रवेश निषेध है।) खोलने के लिए या भौतिक फ़ाइल बनाने का प्रयास करते। डेटा बनाएं विफल। सूचीबद्ध कुछ फ़ाइल नाम नहीं बनाया जा सका। संबंधित त्रुटियों की जांच करें।

यह हल करना बहुत आसान है, मैं इसे जल्दी से यहां भी कवर करूंगा।

डिफ़ॉल्ट रूप से विजुअल स्टूडियो 2012 स्थानीय डीबी नामक एसक्यूएल सर्वर एक्सप्रेस के एक पारे हुए संस्करण का उपयोग करता है। लोकलडीबी एप्लिकेशन की एए चाइल्ड प्रोसेस को स्पिन करेगा, और यदि आप विजुअल स्टूडियो के विकास सर्वर पर अपना आवेदन चला रहे हैं (उदाहरण के लिए http: // localhost: [port] जो आपके ब्राउज़र में दिखाई देता है) तो आप दोनों एप्लिकेशन चला रहे हैं और आपके उपयोगकर्ता खाते के तहत स्थानीय डीबी, सिस्टम या नेटवर्क्स सेवा के तहत नहीं। इसे ठीक करने के लिए आपको बस इतना करना है कि अपने प्रोजेक्ट के App_Data फ़ोल्डर के लिए अपने उपयोगकर्ता को संशोधित अनुमतियां असाइन करें। लॉगिन फिर से प्रयास करें और .mdf फ़ाइल सफलतापूर्वक बनाई जानी चाहिए।

आप उत्सुक हैं, तो आप एक ही समस्या में LocalDB here.

+0

App_Data फ़ोल्डर पर अनुमतियों को संशोधित करने से मेरी समस्या हल हो गई। मुझे आशा है कि यह दूसरों की मदद करेगा। – BrianLegg

9

गॉट बारे में अधिक जानने और मेरे समाधान here पाया जा सकता है। तुम सब वी.एस. डेवलपर कमांड प्रॉम्प्ट खोलने के द्वारा LocalDb बंद करो और (उद्धरण के बिना) दर्ज करना है:

"sqllocaldb.exe रोक v11.0"

"v11 हटाना sqllocaldb.exe।0 "

अगली बार एफई के साथ-साथ फ़ाइल पुन: उत्पन्न होगी डाटाबेस के रूप में।

+0

आपके लिंक ने मेरी मदद की :) –

+2

स्थानीय डीबी उदाहरणों के अन्य नाम हो सकते हैं। 'Sqllocaldb जानकारी' चलाना सभी मौजूदा स्थानीय डीबी उदाहरणों को सूचीबद्ध करेगा। – Paul

0

क्या यह मेरे लिए तय जब मैं प्राप्त था इस त्रुटि है कि मैं अपने वी.एस. परियोजना के App.config फ़ाइल में कनेक्शन स्ट्रिंग बदल है ।

मैं कनेक्शन स्ट्रिंग में इस जोड़ लिया है:

<connectionStrings> 
<add name="Blog" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=true;AttachDbFileName=C:\Users\kostadin\Database1.mdf" providerName="System.Data.SqlClient" /> 

आशा इस किसी और में मदद करता है

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