2011-03-13 12 views
5

मैं ASP.Net Movie Database Tutorial का पालन कर रहा हूं, और यह सब ठीक चल रहा था।एमवीसी 3/ईएफ - मॉडल बदल रहा है ... डेटाबेस स्कीमा विसंगति

मैंने अभी मॉडल बदल दिया है और एक विशेषता जोड़ा है। मुझे उत्सुकता से बुलाओ, लेकिन मैं डेटाबेस को छोड़ने की मार्गदर्शिका का पालन नहीं करना चाहता था - मैं देखना चाहता था कि मैं संशोधित कर सकता हूं या नहीं।

correct error एक विसंगति के बारे में आया - जिसकी अपेक्षा की गई थी।

मैंने डेटाबेस में रेटिंग कॉलम जोड़ा, और सब कुछ काम किया।

इसके बाद, मैं नष्ट कर दिया रेटिंग्स स्तंभ के रूप में मैं ट्यूटोरियल का पालन करें और DropCreateDatabaseIfModelChanges के बारे में सीखना चाहता था - हालांकि, मैं सिर्फ त्रुटि Invalid column name 'Ratings'.

प्राप्त यह सब समय में, ModelHash प्रविष्टि नहीं बदला गया है, और मेरे पास है यह नहीं पता कि यह कैसे पता है कि अब या पहले के बीच एक अंतर है।

तो - 1) क्या मैंने कुछ खराब कर दिया है?

2) मैं कैसे ठीक कर सकता हूं?

3) इससे पहले कि यह कुछ बदल गया है, यह कैसे पता चला, लेकिन अब नहीं है जब हैश नहीं बदला है?

4) क्या कोई अतिरिक्त सलाह है जो आप दे सकते हैं?

उत्तर

5

मुझे लगता है कि आपको विवरण गलत होना चाहिए क्योंकि सही व्यवहार Rating कॉलम मैन्युअल रूप से जोड़े जाने के बावजूद अपवाद फेंक देगा।

  1. जब डेटाबेस नई तालिका बनाई गई है बुलाया EdmMetadata जोड़ा जाता है:

    यह व्यवहार इस प्रकार काम करता है।

  2. EdmMetadata में दो कॉलम हैं - Id और ModelHash
  3. डेटाबेस निर्माण का हिस्सा वर्तमान मॉडल के हैश के साथ एकल पंक्ति संग्रहित कर रहा है।
  4. यदि डेटाबेस वर्तमान संदर्भ द्वारा नहीं बनाया गया था तो संदर्भ पहले ऑपरेशन निष्पादित होने से पहले संग्रहित मॉडल हैश को पुनर्प्राप्त करने के लिए एक क्वेरी निष्पादित करता है। पुनर्प्राप्त की तुलना संदर्भ के वर्तमान हैश से की गई है।
  5. यदि हैश समान नहीं है और डेटाबेस प्रारंभकर्ता द्वारा डेटाबेस मनोरंजन की अनुमति नहीं है तो अपवाद फेंक दिया जाता है।
  6. यदि हैश समान है, तो आवश्यक डीबी ऑपरेशन निष्पादित किया जाता है।

मैन्युअल रूप से Rating कॉलम को संग्रहीत हैश संग्रह नहीं बदलेगा लेकिन मॉडल का हैश अलग होगा।

यह व्यवहार पूरी तरह से IncludeMetadataConvention सम्मेलन को हटाने के द्वारा हटाया जा सकता है:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove(modelBuilder.Conventions 
      .OfType<IncludeMetadataConvention>().ToArray()); 
    } 
+0

हममम - मैं आपको यह सुनिश्चित कर सकते हैं कि मैंने कहा कि मैं वास्तव में क्या किया था ... मुझे लगता है कि गाइड का पालन ठीक है कि - मॉडल है जो आया संशोधित अपवाद के साथ, फिर उन्होंने सुझाई गई स्क्रिप्ट को छोड़ने/लिखने के बजाय, मैंने कॉलम जोड़ा और यह ठीक काम किया। – Wil

+0

@Wil: दिलचस्प है। मैंने कंसोल एप्लिकेशन में वही किया और मैन्युअल रूप से तालिका में कॉलम जोड़ने से समस्या हल नहीं हुई। –

+0

मेरे कुछ पुराने प्रश्नों पर जा रहे हैं ... फिर, मैं आपको घटनाओं के अनुक्रम पर सुनिश्चित कर सकता हूं, लेकिन, आप इस पर मुझसे बहुत अधिक की एक बिल्ली जानते हैं ... कुछ और चल रहा है। उत्तर के रूप में चिह्नित करना और भविष्य में अनमार्क कर सकता है यदि मेरे पास समय/पुन: उत्पन्न हो सकता है। +1 धन्यवाद – Wil

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