डीबग कोड-पहला एंटिटी फ्रेमवर्क माइग्रेशन कोड


138

मैं अपनी वेबसाइट में सबसे पहले Entity Framework कोड का उपयोग कर रहा हूं और अगर माइग्रेशन कोड को डीबग करने का कोई तरीका है तो मैं सोच रहा हूं। आप जानते हैं, जैसे ब्रेकपॉइंट और सामान सेट करना।

मैं डेटाबेस का उपयोग करने के लिए पैकेज मैनेजर कंसोल का उपयोग कर रहा हूं Update-Database

धन्यवाद


यह सिर्फ मानक सी # कोड है - इसलिए हां, निश्चित रूप से, आप इसमें ब्रेकपॉइंट सेट कर सकते हैं .....
marc_s

1
लेकिन पैकेज प्रबंधक कंसोल का उपयोग करने के बाद से एप्लिकेशन वास्तव में नहीं चल रहा है।
डैनियल

1
फिर पैकेज मैनेजर कंसोल से अपग्रेड न करें, लेकिन माइग्रेशन इनिशियलाइज़र को डिफ़ॉल्ट इनिशियलाइज़र के रूप में सेट करें ताकि डेटाबेस आपके माइग्रेशन से पहली बार कनेक्ट हो।
विकिटोर ज़िकला

मैं माइग्रेशन कोड का उपयोग करके अपने डेटाबेस को अपडेट कर रहा हूं और मैं ऐप को रोक नहीं सकता और इसे इनिशियलाइज़र चलाने के लिए फिर से चला सकता हूं।
डैनियल

एसक्यूएल का उपयोग नहीं करने का कारण यह है कि अपडेट के लिए कोड जटिल है और एसक्यूएल का उपयोग करके इसे लागू करना लगभग असंभव है।
डैनियल

जवाबों:


255

मुझे पता है कि EF कोड फर्स्ट माइग्रेशन अपेक्षाकृत नया टूल है, लेकिन आप अभी भी .NET में नहीं हैं।

तो आप उपयोग कर सकते हैं:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

उसके बाद आप अपने भीतर का अपवाद देख सकते हैं।

या आप कोशिश का उपयोग कर सकते हैं ... इस तरह के बयान को पकड़ें : एंटिटी फ्रेमवर्क को संभालते हुए अपवाद


3
हां, यह पैकेज मैनेजर कंसोल के माध्यम से एक अपडेट-डेटाबेस को चलाने के दौरान काम करता है। बेहद सुविधाजनक!
टॉम फर्ग्यूसन

11
मैंने इसे अपने कॉन्फ़िगरेशन के शीर्ष पर जोड़ा है। विधि विधि। यह एक पॉपअप का कारण बनता है जो आपको कोड को डीबग करने के लिए अपना विज़ुअल स्टूडियो चुनने देता है। हालांकि, जब मैं इसे चुनता हूं तो मेरा सिस्टम लटका रहता है (शायद असंबंधित)।
तलोन

3
इस कोड का टुकड़ा कहाँ रखा जाए? अगर कोई मदद कर सकता है! धन्यवाद।
अरित्रा बी

4
आपके कॉन्फ़िगरेशन वर्ग के निर्माता में।
केसी

5
@ टालन गो कॉफी पीते हैं और जब तक आप वापस आते हैं शायद एक और विजुअल स्टूडियो उदाहरण सामने आ जाता है। :)
Corstian Boerman

11

Db माइग्रेशन में ब्रेक पॉइंट को हिट करने के लिए इनिशिएटिव पर MigrateDatabaseToLatestVersion के संदर्भ को सेट करें।

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

तब आप सामान्य रूप से डिबग करते हैं (f5 का उपयोग करके रन करें) और ब्रेकपॉइंट पहली बार जब आप प्रोजेक्ट चलाते हैं, तो हिट हो जाएगा।

अब समस्या यह है कि यदि आप दूसरी बार डिबग करते हैं तो माइग्रेशन नहीं चलेगा। ऐसा इसलिए है क्योंकि __MigrationHistory टेबल को यह अपडेट करने के लिए कहा गया है कि आप नवीनतम संस्करण में माइग्रेट कर चुके हैं। माइग्रेशन को फिर से जांचने के लिए पैकेज मैनेजर कंसोल को खोलें और पिछले माइग्रेशन को डाउनग्रेड करें:

Update-Database TargetMigration: ThePreviousMigrationName

8

मेरा जवाब थोड़ा मूर्खतापूर्ण हो सकता है लेकिन वैसे भी यहाँ जाता है। यदि आप, मेरी तरह, कुछ समय बीज () विधि में समस्याएँ हैं जो मैं आमतौर पर करता हूँ तो बस एक सार्वजनिक विधि बनाएँ जो सुरक्षा बीज को बुलाता है ()।

public void SeedDebug(AppDbContext context)
{
    Seed(context);
}

तब मेरे होमकंट्रोलर में मैं इस विधि को डिबग मोड में कहता हूं।

public class HomeController : Controller
{
    var appDb = new AppDbContext();
    public ActionResult Index()
    {
        var config = new Configuration();
        config.SeedDebug(appDb);
        return View();
    }
}

मुझे पता है कि यह थोड़ा लंगड़ा समाधान है, लेकिन यह सरल और त्वरित है। बेशक यह मॉडल बनने के बाद किया जाना है। तो कदम दर कदम:

  1. मॉडल बनाने के लिए बीज विधि पर टिप्पणी करें और अपडेट-डेटाबेस को निष्पादित करें
  2. सीड () विधि को अनइंस्टॉल करें और ऊपर वर्णित "हैक" को प्लग इन करें।

  3. कॉन्फ़िगरेशन में ऑटो माइग्रेशन अक्षम करें

    यदि आपके पास यह अक्षम है, तो स्वचालित रूप से इस चरण को छोड़ दें

  4. अपने आवेदन को डिबग करें, त्रुटि को ठीक करें और "हैक" को हटा दें


5

यहाँ एक और अधिक विफल प्रूफ विधि है जो बहुत उपद्रव के बिना चाल चलेगी:

चरण # 1: कोड का यह टुकड़ा उस माइग्रेशन के ठीक ऊपर रखें जिसे आप डीबग करना चाहते हैं:

public partial class ORACLE_Test : DbMigration
{
    public override void Up()
    {
        if (!System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Launch();

        AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        [...]
    }

    public override void Down()
    {
    }
}

चरण # 2: अपने माइग्रेशन वाले प्रोजेक्ट को संकलित करें

चरण # 3: आउटपुट माइग्रेशन (/ बिन / डीबग, / बिन / रिलीज़ आदि) के अंदर एक कंसोल खोलें, जिसमें आपके माइग्रेशन का dll होगा

चरण # 4: डीबगर को लॉन्च करने के लिए / scriptFile पैरामीटर के साथ migrate.exe को इनवॉइस करें और वास्तव में वांछित db- माइग्रेशन को डीबग करें

migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"

एक बार डिबगर-चयनकर्ता संवाद पॉप स्टूडियो के दृश्य को चुन लेता है जिसे आपने पहले ही खोल दिया है।


4

आप माइग्रेशन कोड में Console.WriteLine स्टेटमेंट जोड़ सकते हैं (एक महान समाधान नहीं)

ध्यान दें, संदेश केवल तभी दिखाए जाते हैं यदि आप migrate.exeउपयोगिता (इन pacakges\EntityFramework.x.y.z\tools) का उपयोग करके माइग्रेशन कोड चलाते हैं । यदि आप पैकेज मैनेजर कंसोल के माध्यम से माइग्रेशन चलाते हैं तो वे प्रदर्शित नहीं होंगे।


धन्यवाद टॉम ... यह मुझे मिल सकता है निकटतम जवाब था। यदि कोई इसका बेहतर उत्तर नहीं देता है तो मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं। :)
डैनियल

या अपने संदेश के साथ एक अपवाद फेंकें जिसे आप वापस करना चाहते हैं।
डेविड डी सी ई फ्रीटास

2

मेरे पास "Debugger.Launch ()" (जैसे m_david के उत्तर के ऊपर ) का उपयोग करके बहुत सारी किस्मत है, लेकिन CreateDbContext के अंदर यह किसी भी तरह दोनों को जोड़ता है, और संलग्न नहीं करता है। मेरा मतलब है, यह संलग्न है और .asm फ़ाइलों और .cpp फ़ाइलों (आंतरिक कोड) में कदम रखने की कोशिश करना शुरू कर देता है। अगर मैं एक कंसोल पर एक ब्रेकपॉइंट सेट करने की कोशिश करता हूं। जो कि मैं जानता हूं कि मैं बाद में निष्पादित हो जाता हूं (मैं किसी भी "डॉटनेट एफईएफ माइग्रेशन कॉमैंड" से आउटपुट देख सकता हूं) यह दोनों इसे निष्पादित करते हैं और ब्रेकपॉइंट को कभी नहीं मारते हैं।

इसके बजाय मेरे लिए यह काम किया है:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

आप स्थानांतरण की निष्पादित कर सकते हैं और मैन्युअल रूप से दृश्य स्टूडियो का उपयोग कर देते हैं और यह होगा वास्तव में, आप कोड के माध्यम से कदम की तरह आप उम्मीद करते हैं कि यह सिर्फ एक दर्द की अधिक है। क्या मैं वास्तव में कोशिश करनी चाहिए दोनों विधियों का संयोजन है ...


आप किस प्रक्रिया से जुड़ रहे हैं?
XDS

-1

मुझे त्रुटि विवरण प्राप्त करने के लिए यहां एक साफ चाल भी मिली ...

मूल रूप से, ट्रिक एक अपवाद से सभी जानकारी को हथियाने के लिए है, इसे एक स्ट्रिंग में डालें और उत्पन्न स्ट्रिंग और मूल अपवाद के साथ एक नया DbEntityValidationException फेंकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.