2012-08-16 12 views
19

मैं एफई 4.3 से एक MVC 3 आवेदन पलायन कर रहा हूँ 5. एफई को मैंने देखा है कि एफई 5 __MigrationHistory तालिका में एक CreatedOn स्तंभ है, जो के रूप में माइग्रेशन द्वारा बनाए गए थे मौजूद नहीं है उम्मीद की उम्मीद एक पुराना संस्करणइकाई की रूपरेखा 5 MigrationHistory मेज से CreatedOn स्तंभ

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn] 
FROM [dbo].[__MigrationHistory] AS [c] 

मेरे माइग्रेशन इतिहास को मिटाए बिना मैं इस समस्या को कैसे हल करूं? मैं प्रवास नाम है, जो निम्न स्वरूप में है से स्तंभ के मूल्य का अनुमान लगाने के एक प्रश्न के बारे में सोच रहा हूँ:

201203111201542_MigrationName 
+0

यह MiniProfiler के साथ कोई विरोध हो गया लगता है: http://community.miniprofiler.com/permalinks/99/sqlexception-on-ef-5 -w-net-4-5 – CMircea

उत्तर

5

CreatedOn स्तंभ नहीं रह गया है की आवश्यकता है। हम यह निर्धारित करने के लिए कि क्या इसे छोड़ना है या नहीं, हम इससे पूछने का प्रयास करते हैं। यानी आप 4.3 से 5.

+7

मुझे नहीं पता कि यह मूल प्रश्न का उत्तर कैसे देता है - 'मैं कैसे हल करूं ...' – Spongman

+5

@SpongeMan: मुझे यह अपवाद मिल रहा था, लेकिन यह बाहर निकला, मैंने गलती से सभी अपवादों को तोड़ने के लिए विजुअल स्टूडियो की स्थापना की थी, न केवल अनचाहे लोगों को। इसलिए जब एंड्रयू ने इसे स्पष्ट रूप से नहीं कहा, तो संकल्प पहली मौका अपवादों को तोड़ना बंद करना है। डीबग-> अपवाद, फिर थ्रो कॉलम को अन-चेक करें। – HiredMind

5

ईएफ कोड में पहली बार माइग्रेशन सक्षम के साथ ऐसा लगता है, जब आप ईएफ 4 से * * ईएफ 5.0 में अपग्रेड करते हैं। और वह MiniProfiler के साथ संयोजन में। तालिका तालिकाओं के अंतर्गत dbo._MigrationHistory में मौजूद थी।

आप कुछ बातें करते हैं की कोशिश:

  1. आप सिस्टम टेबल फ़ोल्डर के अंतर्गत dbo._MigrationHistory मेज पर मैन्युअल CreatedOn (DATETIME) स्तंभ जोड़ सकते हैं।
  2. आप कॉन्फ़िगरेशन सेट करके परिवर्तनों का पता लगाना बंद कर सकते हैं। AutoDetectChangesEnabled = false;
  3. इस लाइन को टिप्पणी करें MiniProfilerEF.Initialize(), ईएफ प्रोफाइलिंग को अक्षम करना।

बनाया गया कॉलम जोड़ने के लिए बीज विधि का एक उदाहरण यहां दिया गया है। प्रत्येक बार संदर्भ प्रारंभ होने पर यह कॉलम हटा दिया जाएगा। बीज विधि संदर्भ के विन्यास वर्ग में है।

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // Hide error Invalid column name 'CreatedOn' from mini profiler. 
     context.Database.ExecuteSqlCommand(
      @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn') 
       ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME()); 
     "); 
    } 
} 
+0

AutoDetectChanges = झूठी वास्तव में समस्या को हल नहीं करता है, यह "मैन्युअल" माइग्रेशन के साथ भी होता है। लेकिन आप निश्चित रूप से अन्य दो समाधानों के साथ सही हैं। धन्यवाद। –

+0

hmmm मैंने सोचा कि मैंने इसे सही तरीके से परीक्षण किया है: पी जानकारी के लिए धन्यवाद –

+0

एक निर्मितऑन फ़ील्ड जोड़ना या तो काम नहीं करता है, क्योंकि अगला माइग्रेशन इसे तुरंत छोड़ देगा और यह फिर से शुरू हो जाएगा। –

6

फिलिप कॉर्नेलिसन की तरह ही, यह MiniProfiler.EF और Entity Framework 5.0 के बीच एक बात है।

समस्या को हल करना/छिपाना वास्तव में आपके विचार से आसान है। यह केवल एक "डीबगिंग समस्या" है क्योंकि आपको प्राप्त होने वाली त्रुटि केवल तत्काल अवधि (नए माइग्रेशन की जांच) के दौरान हो रही है, और त्रुटि एक "एसक्यूएल अनहेल्डल्ड अपवाद" है।

तो, यह समस्या को हल करने के लिए आसान है:

अपने "डीबग" टैब पर दृश्य स्टूडियो में जाओ। "अपवाद" आइटम दबाएं। नए संवाद में, आप पेड़ "आम भाषा रनटाइम अपवाद" खोलते हैं। के तहत System.Data.SqlClient.SqlException "" System.Data.SqlClient, के बाद दोनों चेक बॉक्स को अनचेक "। यदि यह वहाँ नहीं है यह जोड़ें।

और बंद फिर जाना!

+11

लेकिन यह सभी एसक्यूएलएक्सप्शन को दबाने देगा .. –

+2

हां यह होगा। लेकिन जहां तक ​​मुझे पता है, ईएफ एसक्यूएल अपवादों को फेंक नहीं देता है। तो यह आपके ईएफ संचालित परियोजनाओं में उन अपवादों को अनदेखा करना बहुत सुरक्षित है। –

4

फ़िलिप कार्नेलिसेन जवाब के अनुसार निम्नलिखित स्क्रिप्ट इस समस्या को हल करता है

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL 

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE() 
GO 
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE() 
+5

हां यह करता है, लेकिन यह केवल अस्थायी है। बनाया गया कॉलम फिर से गिरा दिया जाएगा! बस एक समय का मामला। –

3

यहां एक वर्कअराउंड है जिसका मैं उपयोग कर रहा हूं।व्यक्तिगत रूप से, मैं हरी तीर दबाकर दो बार (प्रारंभ डिबगिंग और फिर जारी रखें) के साथ ठीक कर रहा हूँ, लेकिन अगर आप वास्तव में इसे तोड़ने बंद करना चाहते हैं, इस पोस्ट का निर्माण घटना जो MiniProfiler PDB निकाल देंगे की कोशिश:

del "$(TargetDir)MiniProfiler.pdb" /q /s 

अद्यतन : अगर है कि आप के लिए बहुत ज्यादा काम है, मैं बनाया एक NuGet package:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix 
संबंधित मुद्दे