14

परंपरागत रूप से मैंने हमेशा अपनी एसक्यूएल स्क्रिप्ट को हाथ से लिखा है, इसलिए वे अच्छे और साफ हैं (मैं जेनरेट किए गए लोगों का प्रशंसक नहीं हूं) और रिलीज करने के लिए रिलीज करता हूं, मैं पिछले संस्करण से एक ताजा इंस्टॉल स्क्रिप्ट और माइग्रेशन स्क्रिप्ट प्रदान करता हूं जो कि नई टेबल बनाता है, मौजूदा टेबल बदलता है आदि यह सब सुंदर मानक है।ईएफ 4 कोड पहले उत्पादन वातावरण में स्कीमा परिवर्तन कैसे संभालता है?

मेरे पास वास्तव में ईएफ 4 कोड के साथ खेलने के लिए अधिक समय नहीं था, लेकिन अगर यह वास्तव में उत्पादन वातावरण में व्यवहार्य है तो इसका उपयोग करने में काफी दिलचस्पी है।

कहें कि आपके पास पहला कोड है जहां कोई अस्तित्व नहीं है, तो डेटाबेस स्वचालित रूप से बनाया जाएगा। क्या होता है यदि आप सॉफ़्टवेयर का एक नया संस्करण जारी करते हैं जिसमें स्कीमा/मॉडल परिवर्तन होते हैं। अद्यतन ईएफ मॉडल से मेल खाने के लिए डेटाबेस स्कीमा को अद्यतन करने के लिए पर्याप्त स्मार्ट है?

परिदृश्य

  1. ग्राहक अपने सर्वर पर स्थापित asp.net MVC वेबसाइट। पहली बार चलाने पर, एक ताजा डेटाबेस
  2. ग्राहक थोड़ी देर के लिए वेबसाइट का उपयोग करता है और डेटाबेस कुछ डेटा
  3. इस बीच वेबसाइट का एक नया संस्करण जारी किया गया है और एफई मॉडल बदल गया है
  4. ग्राहक नई डाउनलोड करता है के साथ आबादी वाले हो जाता बनाई गई है संस्करण, मौजूदा डेटाबेस से वेबसाइट और अंक तैनात

कोड पहले प्रारंभिक तैनाती के लिए ही उपयोगी है, या बहुत चालाक इस तरह जारी करने के लिए एक मौजूदा डेटाबेस रिलीज अद्यतन करने के लिए है?

उत्तर

6

ईएफ सीटीपी 4 के रूप में, आपका डेटाबेस गिरा दिया जाएगा और हर बार जब आप अपना ऑब्जेक्ट मॉडल बदलते हैं तो यह फिर से बनाया जाएगा (यह डिफ़ॉल्ट सम्मेलन नहीं है और आपको स्पष्ट रूप से डेटाबेस प्रारंभकर्ता रणनीति सेट करके ऐसा करने के लिए ईएफ कोड-प्रथम को स्पष्ट करना होगा)। एक समाधान है कि समय जो अनिवार्य रूप से डेटाबेस में परिवर्तन करने में वापस करने की कोशिश करता पर अपने ऑब्जेक्ट मॉडल परिवर्तन के रूप में डेटाबेस स्कीमा विकसित करेंगे:

कहा जा रहा है, एफई टीम सक्रिय रूप से एक Database Evolution (aka Migrations) Solution कि वास्तव में अपने परिदृश्य के पते पर काम कर रहे इसे पुन: बनाने के बजाय अपने मॉडल के साथ सिंक करें।

एफई टीम के अनुसार, इस सुविधा एफई अगले संस्करण का हिस्सा रास्ते पर है कि 2011

+0

जानना अच्छा है, हालांकि यह सुविधा जंगली में नहीं है, मुझे नहीं लगता कि यह एक ऐसा मार्ग है जिसे मैं कार्यालय में वकील कर सकता हूं। –

+0

हाँ मुझे यकीन नहीं था कि ईएफ 4 ढांचा इसे संभालने के लिए काफी परिपक्व था या नहीं। लिंक के लिए धन्यवाद। अपडेट के लिए 2011 की शुरुआत में मैं इस सुविधा पर रोक लगाऊंगा और ईएफ टीम की निगरानी करूंगा। चीयर्स! –

+1

@confusedGeek: इस सुविधा को रिलीज़ करने के बाद भी, मुझे पूरा भरोसा है कि कोई भी उद्यम फ्लाई पर उनके लिए इसे ठीक करने के लिए ईएफ को अपना उत्पादन डेटाबेस नहीं देगा। परिवर्तन स्क्रिप्ट को हमेशा डीबीए के माध्यम से जाना पड़ता है, चाहे वह आपके द्वारा या ईएफ द्वारा लिखा जा रहा हो। –

2

एक डेटाबेस बनाने की क्षमता के 1 तिमाही को जारी किया जाना के रूप में उपलब्ध हो जाएगा बस एक सुविधा है कोड पहले - और यह वैकल्पिक सुविधा है। आपको इस सुविधा का बिल्कुल उपयोग नहीं करना है। वास्तव में, स्कॉट ग के पास Code First with an existing database का उपयोग करने के लिए समर्पित एक संपूर्ण ब्लॉग पोस्ट है।

डाटाबेस माइग्रेशन जारी होने तक, आपको एक और रणनीति के साथ आना होगा और यह रणनीति आपके पारंपरिक रूप से आपके वैकल्पिक टैबलेट स्क्रिप्ट का प्रबंधन करेगी। तो जब आप एक नया संस्करण तैनात करते हैं, तो आप अपनी ALTER स्क्रिप्ट चलाते हैं और उस कोड को तैनात करते हैं जिसमें मॉडल में परिवर्तन होते हैं।

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

0

मैं डेटाबेस संदर्भ प्रारंभकर्ता पर काम कर रहा हूं जो मॉडल और डीबी स्कीमा सिंक से बाहर होने पर वेबमास्टर को सूचित करेगा। यह उन डेवलपर्स के लिए उपयोगी हो सकता है जो कोड-प्रथम मॉडल और डेटाबेस स्कीमा दोनों पर पूर्ण नियंत्रण रखना पसंद करते हैं। इसे देखें:

https://github.com/rialib/efextensions

0

महीने बीत चुके हैं और अब आधिकारिक जवाब जारी की गई है: IDatabaseInitializer

यहाँ और अधिक या कम है तो आप जो खोज रहे हैं:

public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext> 
    where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) 
    { 
    } 
} 

यहाँ से लिया: http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

अब आप अपने स्कीमा जिस तरह से आप के लिए इस्तेमाल कर रहे हैं बदल सकता है। बेशक, आप एक अधिक जटिल डेटाबेसइनाइज़रिज़र भी लिख सकते हैं जो एसक्यूएल के बजाय सी # का उपयोग करता है, और यह देखने के लिए जांच कर रहा है कि क्या इसे बदलने से पहले एक बदलाव आवश्यक है, डेटा बदलने के रूप में डेटा बदलना आदि।

अन्य StackOverflow सवाल है कि संशोधित टेबल के विवरण में से कुछ के साथ सौदों: Entity Framework Code First fluent API setting field properties in a for loop

0

एफई 6 का उपयोग करना, यू अपने डेटाबेस (कोड-प्रथम) यकीन है कि सभी अद्यतन स्थापित कर रहे हैं बनाने के लिए, कभी कभी यू में अलग स्कीमा हो सकता है फिर से इंजीनियर कर सकते हैं अपने मौजूदा संदर्भ डेटाबेस में उन्हें संदर्भित करने के लिए मौजूदा डेटाबेस

modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge"); 

यदि आप ईएफ नहीं करते हैं तो dbo.yourtable और FullDepot.secondtable आदि जैसे टेबल

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