2012-02-17 14 views
46

का उपयोग करते समय डेटाबेस को स्पष्ट रूप से नामित करने के लिए मैंने हाल ही में एंटीटी फ्रेमवर्क माइग्रेशन का उपयोग करना शुरू कर दिया है और देखा है कि जब मैं Update-Database कमांड चलाता हूं तो डेटाबेस नाम मेरे लिए नहीं खींच रहा है।एंटिटी फ्रेमवर्क माइग्रेशन 4.3

मेरे connectionstring है:

<connectionStrings> 
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

बहुत पहली बार मैं चलाने अद्यतन-डाटाबेस मेरी डेटाबेस सही नाम TestDB साथ बनाया जाता है। हालांकि, जैसे ही मैं जब तक मैं एक अप परियोजना प्रारंभ नाम जोड़ने यह किसी भी अब मेरे लिए अपडेट नहीं करेंगे मेरी संस्थाओं में से एक में कोई परिवर्तन करने के रूप में (मैं एक बहु परियोजना समाधान का उपयोग कर रहा): तो

Update-Database -StartUpProjectName "TestDB.Data" 

यह एक और नया डेटाबेस बनाता है जो माइग्रेशन हमेशा उपयोग करना जारी रखेगा। मैं StartUpProjectName आदेश में डाल करने के लिए कोई आपत्ति नहीं है लेकिन वहाँ डेटाबेस इस उत्पादन के लिए डिफ़ॉल्ट नाम ओवरराइड करने के लिए एक तरीका है? यह हमेशा के रूप में

TestDB.Data.DataContext 

डेटाबेस बनाता है वहाँ यह सुनिश्चित करें कि डेटाबेस जब StartUpProject नाम गुजर बनाया सिर्फ TestDB कहा जाता है एक रास्ता है या इस StartUpProjectName सेटिंग का उपयोग की एक सीमा है?

एक नोट के रूप में, मुझे लगता है कि कारण मैं StartUpProjectName निर्दिष्ट करने की आवश्यकता है कि मैं एक बहुपरत परियोजना सेटअप है। माइग्रेशन विन्यास फ़ाइल मेरे 'डाटा' परियोजना में है, संस्थाओं/मॉडल, आदि मेरी 'डोमेन' परियोजना में हैं मैं भी है वर्तमान में किसी भी प्रारंभ मेरी Global.asax.cs फ़ाइल में विकल्प के रूप मैं पहले पर इस्तेमाल होता नहीं कोड पहले ef 4.2। तो मेरी परियोजना में मेरे पास सिर्फ मेरे डेटा प्रोजेक्ट में डेटा कॉन्टेक्स्ट है और उस प्रोजेक्ट में माइग्रेशन कॉन्फ़िगरेशन भी है।

संपादित करें:

मैं मूल रूप से सेटअप इस सवाल का मैं 'सही' जिस तरह से एक multiproject समाधान में एक डेटाबेस नाम है पर ठोकर खाई के बाद से। जबकि नीचे दिया गया जवाब काम करेगा, इसका मतलब यह है कि आप अपने web.config को दूसरे क्षेत्र में डुप्लिकेट कर रहे हैं जो आदर्श समाधान नहीं है। इसके बजाय आप सिर्फ नाम अपने DbContext में कुछ इस तरह करने से रख सकते हैं (DataContext सिर्फ नाम मैं अपने प्रोजेक्ट में प्रयोग किया जाता है):

public class DataContext : DbContext 
{ 
    public DataContext() : base("DatabaseNameHere") 
    { } 

    public DbSet<Table1> Table1 { get; set; } 
    public DbSet<Table2> Table2 { get; set; } 

    public virtual void Commit() 
    { 
     base.SaveChanges(); 
    } 
} 

धन्यवाद,

रिच

+3

अपने संपादित करने के लिए धन्यवाद मुझे बहुत answer..helped .. – Josh

+3

संपादित जवाब एक मणि है! – P6345uk

+0

इसके अतिरिक्त, मुझे यह आलेख उपयोगी पाया। http://msdn.microsoft.com/en-us/data/jj592674.aspx – billb

उत्तर

27

जब आप update-database कर प्रोजेक्ट निर्दिष्ट करना चाहिए जिसमें माइग्रेशन शामिल हैं। सुनिश्चित करें कि आपके पास उस प्रोजेक्ट में app.config फ़ाइल है जिसमें सही कनेक्शन स्ट्रिंग है।

जब कई परियोजनाओं पर एक आवेदन ऊपर बंटवारे, कनेक्शन जब अनुप्रयोग से चलाया गया स्ट्रिंग परियोजना में से एक शुरू कर दिया है। माइग्रेट करते समय, कनेक्शन स्ट्रिंग प्रयुक्त प्रोजेक्ट में से एक है।

जब मैंने एक समान सेटअप किया तो मुझे दो स्थानों पर कनेक्शन स्ट्रिंग जोड़नी पड़ी। थोड़ा अजीब, लेकिन यह काम करता है।

+0

बस इसका परीक्षण किया और यह काम किया! सुझाव के लिए धन्यवाद - अन्य परियोजना में कनेक्शन स्ट्रिंग डालने के लिए कभी नहीं पता लगाया होगा! धन्यवाद फिर से :) –

+0

मैंने अपने कनेक्शन स्ट्रिंग को एक अलग कनेक्शन स्ट्रिंग फ़ाइल में रखा है, जिसे वेब प्रोजेक्ट में संदर्भित किया गया है। मैं फिर अपने अन्य प्रोजेक्ट से उस कनेक्शन स्ट्रिंग फ़ाइल से लिंक करता हूं, जो परियोजनाओं में कनेक्शन स्ट्रिंग को डुप्लिकेट करने से बचाता है। – MrBliz

+0

ऐसा लगता है कि पैकेज प्रबंधक कंसोल विजुअल स्टूडियो में वर्तमान निर्माण कॉन्फ़िगरेशन को अनदेखा करता है। क्या यह अपेक्षित व्यवहार है? मुझे सही कनेक्शन स्ट्रिंग चुनने में काफी दिलचस्पी है, लेकिन परियोजना में अन्य अंतर भी हो सकते हैं। पैकेज प्रबंधक कंसोल कैसे तय करता है कि exe/dll चुनने के लिए? –

62

आप ऐप में इसे प्रबंधित करने से बच सकते हैं।एक पैरामीटर के रूप में यह पेशकश के द्वारा config:

Update-Database -Verbose 
-ConnectionString "CONNECTIONSTRING" 
-ConnectionProviderName "System.Data.SqlClient" 
-StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT 

आसान piezy, अगर आप बेहद टाइप करने के लिए प्यार करता हूँ।

+0

क्या होगा यदि यह "System.Data.SqlClient" नहीं ढूंढ सकता है? –

+0

क्या कोई तरीका है कि इसे वेब पर परिभाषित किया जा सकता है।स्टार्टअप प्रोजेक्ट से कॉन्फ़िगर करें? मैं चाहता हूं कि मेरा बिल्ड सर्वर स्वचालित रूप से माइग्रेशन परिवर्तन को मेरे डेटाबेस में धक्का दे, लेकिन मुझे ऐसा करने की इजाजत नहीं दे रही है – amhed

+0

यदि आप वेब.कॉन्फिग से कनेक्शन स्ट्रिंग खींचने की कोशिश कर रहे हैं, तो आपको '-ConnectionStringName "DefaultConnection का उपयोग करना चाहिए" ' – Leigh

9

मैं Nuget से नवीनतम EF5 साथ की कोशिश की।

हालांकि Update-Database परियोजना है कि माइग्रेशन (बस जवाब 1 साल पहले) समाहित होते हैं से App.config नहीं पढ़ता लेकिन यह केवल से *.config पढ़ा जाएगा परियोजना शुरू। यह बहुत अच्छा है, लेकिन मैं कैसे Add-Migration और Update-Database एक उपयुक्त कनेक्शन स्ट्रिंग यहाँ मिल की खोज:

  1. यह "DefaultConnection" कनेक्शन स्ट्रिंग पहले
  2. तो यह संदर्भ वर्ग के आधार पर कनेक्शन स्ट्रिंग नाम पाने के लिए कोशिश कर रहा है प्राप्त करने की कोशिश नाम। जैसे मेरे पास MyContext कक्षा DbContext से ली गई है, इसलिए मैं "MyContext" कनेक्शन स्ट्रिंग नाम का उपयोग कर सकता हूं। उपयोगी जब मेरे पास एकाधिक डीबी कनेक्शन हैं।
  3. तो उपरोक्त दोनों कनेक्शन स्ट्रिंग नाम नहीं पाए जाते हैं, यह विफल हो और कोई "DefaultConnection" कनेक्शन स्ट्रिंग दिखाने जब तक आप -ConnectionStringName पैरामीटर की आपूर्ति करेगा। पैकेज प्रबंधक कंसोल में सहायता पृष्ठ देखने के लिए get-help Update-Database देखें।

कोई पुनः प्रयास या फ़ॉलबैक प्रयास नहीं है, इसलिए यदि "डिफ़ॉल्ट कनेक्शन" में एक गलत कनेक्शन स्ट्रिंग है, तो यह केवल एक त्रुटि दिखाएगी।

दोनों DefaultConnection और संदर्भ नाम कनेक्शन तार में मौजूद हैं, तो DefaultConnection प्राथमिकता दी जाएगी।

मैं # 2 पसंद करेंगे पहली कोशिश हो जाएगी, क्योंकि नाम अधिक विशिष्ट है, लेकिन ऊपर के चरणों क्या EF5 माइग्रेशन करते हैं जब db से कनेक्ट करने की कोशिश कर रहा है।

+1

मैं एक ही मुद्दे पर चल रहा था और पता चला, इस पोस्टर के समान, माइग्रेशन स्टार्ट अप प्रोजेक्ट में कनेक्शन स्ट्रिंग का उपयोग करते हैं, और कनेक्शन स्ट्रिंग का नाम संदर्भ के समान नाम है। –

+0

यह वास्तव में अजीब है। यह स्टार्टअप प्रोजेक्ट कॉन्फ़िगरेशन फ़ाइल से कनेक्शनस्ट्रिंग को हमेशा पढ़ता है। यदि DbContext नाम के साथ डेटाबेस बनाने से नहीं मिला है। – Nps

21

आप अपने कनेक्शन स्ट्रिंग एक अन्य परियोजना में अपनी वेबसाइट परियोजना में web.config और DBContext और प्रवास फ़ाइलों में संग्रहीत और अब भी वही कनेक्शन स्ट्रिंग का हिस्सा हो सकता है। हालांकि आपको यह सुनिश्चित करने की ज़रूरत है कि पैकेज मैनेजर कंसोल के लिए डिफ़ॉल्ट प्रोजेक्ट के रूप में डेटा प्रोजेक्ट (या जो भी प्रोजेक्ट में डीबीसीएन्टेक्स्ट इत्यादि है) को सेट करना, आप भी यह सुनिश्चित करना चाहते हैं कि आपकी वेबसाइट पर सेट हो डिफ़ॉल्ट स्टार्टअप परियोजना !!!

मैं इसे कहीं भी दस्तावेज नहीं देख सकता, लेकिन यह समझने में सक्षम नहीं होने के 24 घंटों में क्यों नहीं आया कि अचानक मेरे एसक्यूलेक्सप्रेस डीबी पर लागू होने के कारण, मुझे इस निष्कर्ष पर पहुंचा।

+3

दो साल बाद एक +1, क्योंकि उपरोक्त बोल्ड हिस्सा बिल्कुल मेरी 24 घंटे की खोज के बाद आवश्यक था! –

+0

धन्यवाद! कनेक्शन स्ट्रिंग स्टार्टअप प्रोजेक्ट के app.config/web.config से पढ़ी जाती है। – Zantier

+0

या तो डिफ़ॉल्ट स्टार्टअप प्रोजेक्ट सेट करें या EF माइग्रेशन कमांड में -StartUpProjectName प्रॉपर्टी सेट करें। –

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