12

पहले ईएफ 4.3 का उपयोग कर रहा था और 5.0 तक अपग्रेड करने पर मुझे इंडेक्स, एफके बाधाएं, और पीके बाधाओं का पता चला डीबीओ शामिल करने के लिए उनके नामकरण सम्मेलन बदल गए हैं (उदाहरण के लिए पीके_यूसर अब पीके_डबो.यूसर बन गए हैं)इकाई फ्रेमवर्क कोड-प्रथम माइग्रेशन - बाधा नहीं छोड़ सकता क्योंकि यह अस्तित्व में नहीं है (4.3 से 5.0 तक सम्मेलन का नामकरण)

अब जब भी मैं मॉडल में बदलाव करता हूं और इसे उस तालिका को बदलने की ज़रूरत होती है जिसमें यह है, यह हमेशा यह कहता है बाधा नहीं छोड़ सकती क्योंकि यह इसे नहीं मिल सकती है।

मुझे बस यह चाहिए कि जब यह एक बाधा/अनुक्रमणिका/कुंजी को छोड़ने का प्रयास करता है तो पहले यह देखने के लिए जांच करता है कि प्री-5.07 नामकरण एक मौजूद है और यदि ऐसा है तो इसे छोड़ दें, लेकिन फिर भी इसे नए 5.0 का उपयोग करके फिर से बनाएं नामकरण की परंपरा।/इंडेक्स

प्राथमिक कुंजी

Old: PK_Users     New: PK_dbo.Users 

विदेशी कुंजी

Old: FK_Users_Roles_Role_Id  New: FK_dbo.Users_dbo.Roles_Role_Id    

नोट::

नामकरण सम्मेलनों 4.3 से 5.0 के लिए इतना तरह बदल मैं नहीं कर सकता बस एफई है सभी तालिकाओं को पुनर्जीवित , मेरे पास इस डेटाबेस में उत्पादन डेटा है। मैं कस्टम माइग्रेशन का उपयोग करके प्रत्येक तालिका के लिए मैन्युअल रूप से ऐसा नहीं करना चाहता हूं।

संपादित करें: मुझे एक समान प्रश्न मिला How can I stop Entity Framework 5 migrations adding dbo. into key names? लेकिन यह लड़का सिर्फ 5.0 सम्मेलनों को अनदेखा करना चाहता था और 4.3 के साथ चिपक गया था, और यह केवल टेबल नामकरण के साथ निपटा था। मैं ऐसा नहीं करना चाहूंगा क्योंकि ईएफ के बाद के संस्करणों में अधिक परिवर्तन हो सकते हैं जो इस कोड को प्रभावित करेंगे और केवल लाइन के नीचे परेशानी होगी।

मैं एक ही नस में कुछ कर रही कोशिश के रूप में उत्तर पोस्ट:

public class CodeMigrator : CSharpMigrationCodeGenerator 
{ 
    protected override void Generate(
     DropIndexOperation dropIndexOperation, IndentedTextWriter writer) 
    { 
     dropIndexOperation.Name = StripDbo(dropIndexOperation.Name); 
     base.Generate(dropIndexOperation, writer); 
    } 

    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer) 
    { 
     dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name); 
     base.Generate(dropForeignKeyOperation, writer); 
    } 

    protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer) 
    { 
     dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name); 
     base.Generate(dropPrimaryKeyOperation, writer); 
    } 

    // TODO: Override other Generate overloads that involve table names 

    private string StripDbo(string name) 
    { 
     return name.Replace("dbo.", ""); 
    } 
} 

और config में जोड़ने:

public Configuration() 
    { 
     CodeGenerator = new CodeMigrator(); 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = false; 

    } 

हालांकि त्रुटि अभी भी हिट:

dbo.Users_dbo.Departments_Department_Id 'एक बाधा नहीं है। बाधा नहीं छोड़ सका। पिछली त्रुटियां देखें।

मैं वास्तव में ओवरराइड CSharpMigrationCodeGenerator में हर सदस्य की कोशिश की और वापसी कथन पर एक ब्रेकपाइंट की स्थापना, और उनमें से कोई मारा। तो ऐसा लगता है कि मेरा कस्टम जनरेटर कभी भी उपयोग नहीं होता है, यह सुनिश्चित नहीं है कि मैं इसके साथ क्या खो रहा हूं।

+0

आप 'का प्रयास किया -IngoreChanges', यह (हालांकि निश्चित नहीं) मदद करने में सक्षम हो सकता है - [-IngoreChanges] (http: // stackoverflow.com/a/9623319/417747)। यह आपके मौजूदा डीबी 'जैसा है' को स्कैफोल्ड करेगा - लेकिन फिर आपको यह देखने की ज़रूरत है कि क्या होता है, यह w/मौजूदा नामकरण काम कर सकता है। आपको अपनी माइग्रेशन स्क्रिप्ट (####। Cs फ़ाइलों) को मैन्युअल रूप से समायोजित करने की आवश्यकता हो सकती है जहां/जब आवश्यक हो। यह शायद किसी बिंदु पर 'एक दीवार मारा' होगा - मुझे नहीं लगता कि आप हमेशा पुराने सम्मेलन के साथ भाग सकते हैं। अगर संभव हो तो सम्मेलन को नजरअंदाज करना मेरे लिए बुरा विचार नहीं है। मुझे बताएं। – NSGaga

+0

मैं परिवर्तनों को अनदेखा नहीं करना चाहता हूं, मैंने बदलाव किए हैं जिन्हें चलाने की आवश्यकता है, यह सिर्फ इतना है कि ऐसा करने की प्रक्रिया में, यह किसी ऐसे चीज़ के साथ बदलाव करने की कोशिश करता है जो अस्तित्व में नहीं है क्योंकि यह इसके माध्यम से खोज रहा है नया सम्मेलन मैं सम्मेलन को अनदेखा नहीं करना चाहता हूं या पुराने व्यक्ति के साथ रहना नहीं चाहता हूं। मुझे बस यह बताने में सक्षम होना चाहिए कि जिस चीज़ को ढूंढ रहे हैं उसे ढूंढें, फिर सामान्य की तरह व्यवहार करें। मैंने सोचा कि मैं डीबीओ को हटाने के लिए 'माइग्रेशनऑपरेशंस' में 'नाम' को बदलकर ऐसा कर सकता हूं। संदर्भ, लेकिन यह चल रहा प्रतीत नहीं होता है। – SventoryMang

+0

मुझे लगता है कि मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं - लेकिन आप 'बिल्कुल' नहीं कर सकते जो आप आईएमओ चाहते हैं, इसलिए आपको अगली सबसे अच्छी चीज़ चाहिए। केवल ईएफ 6 शुरू करने से आपको सम्मेलनों पर पूर्ण नियंत्रण मिलता है, कस्टम इत्यादि बनाते हैं। ईएफ 6 पहले से ही उपलब्ध है (पूर्ण स्रोत के साथ), यह अभी भी बीटा में है - लेकिन लंबे समय तक नहीं - तो हो सकता है कि यह आपका विकल्प है (कस्टम सम्मेलनों के साथ - मेरे पास यदि आवश्यक हो तो उसके साथ पोस्ट करें)। और यह वास्तव में 'परिवर्तनों को अनदेखा नहीं कर रहा है' - आप पहले 'पुरानी स्थिति' को अनदेखा करते हैं, इसलिए यह आपके पास पहले से 'निगल' सकता है (आपको पहले कोड पर वापस जाने की आवश्यकता हो सकती है)। फिर आप परिवर्तन लागू करते हैं, और माइग समायोजित करते हैं। सीएस – NSGaga

उत्तर

6

मैंने जवाब निकाला और यह मेरे प्रश्न में जुड़े प्रश्न में उत्तर के समान है। CSharpCodeGenerator ओवरराइड करने में समस्या का उपयोग केवल कस्टम माइग्रेशन में किया जाता है।

स्वचालित माइग्रेशन को ओवरराइड करने के लिए आपको SqlServerMigrationSqlGenerator कक्षा को ओवरराइड करने और माइग्रेशन में SetSqlGenerator() पर कॉल करने की आवश्यकता है।विन्यास निर्माता:

public class SqlMigrator : SqlServerMigrationSqlGenerator 
{ 
    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation) 
    { 
     dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name); 
     base.Generate(dropForeignKeyOperation); 
    } 

    protected override void Generate(DropIndexOperation dropIndexOperation) 
    { 
     dropIndexOperation.Name = StripDbo(dropIndexOperation.Name); 
     base.Generate(dropIndexOperation); 
    } 

    protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation) 
    { 
     dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name); 
     base.Generate(dropPrimaryKeyOperation); 
    } 

    private string StripDbo(string name) 
    { 
     return name.Replace("dbo.", ""); 
    } 
} 

और प्रवास config:

public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = false; 
     SetSqlGenerator("System.Data.SqlClient", new SqlMigrator()); 
    } 
संबंधित मुद्दे