ডিবাগ কোড প্রথম সত্তা ফ্রেমওয়ার্ক মাইগ্রেশন কোড


138

আমি আমার ওয়েবসাইটে প্রথমে সত্ত্বা ফ্রেমওয়ার্ক কোডটি ব্যবহার করছি এবং আমি কেবল ভাবছি যে মাইগ্রেশন কোডগুলি ডিবাগ করার কোনও উপায় আছে কিনা। আপনি জানেন, ব্রেকপয়েন্ট এবং এর মতো স্টাফ সেট করা।

ব্যবহার করে ডাটাবেস আপডেট করতে আমি প্যাকেজ ম্যানেজার কনসোল ব্যবহার করছি Update-Database

ধন্যবাদ


এটি কেবলমাত্র স্ট্যান্ডার্ড সি # কোড - তাই হ্যাঁ অবশ্যই আপনি এটিতে ব্রেকপয়েন্ট নির্ধারণ করতে পারেন .....
মার্ক_স

1
আমি যখন প্যাকেজ ম্যানেজার কনসোল ব্যবহার করছি তবে অ্যাপ্লিকেশনটি আসলে চলমান নেই।
ড্যানিয়েল

1
তারপরে প্যাকেজ ম্যানেজার কনসোল থেকে আপগ্রেড করবেন না তবে মাইগ্রেশন ইনিশিয়ালাইজারটিকে ডিফল্ট আরম্ভকারী হিসাবে সেট করুন যাতে আপনার অ্যাপ্লিকেশনটির সাথে প্রথমবারের সাথে সংযোগ স্থাপনের সময় ডাটাবেসটি স্থানান্তরিত হয়।
উইক্টর জাচলা

আমি মাইগ্রেশন কোডটি ব্যবহার করে আমার ডেটাবেস আপডেট করছি এবং আমি অ্যাপ্লিকেশনটি থামাতে এবং আরম্ভকারী চালানোর জন্য এটি আবার চালাতে পারি না can't
ড্যানিয়েল

যে কারণে আমি এসকিউএল ব্যবহার করছি না তা হ'ল আপডেট করার কোডটি বরং জটিল এবং এসকিউএল ব্যবহার করে এটি প্রয়োগ করা প্রায় অসম্ভব।
ড্যানিয়েল

উত্তর:


255

আমি জানি যে ইএফ কোড ফার্স্ট মাইগ্রেশনগুলি তুলনামূলকভাবে নতুন সরঞ্জাম তবে আপনার সম্পর্কে এখনও নেট। নেট এ ভুলে যাবেন না।

সুতরাং আপনি ব্যবহার করতে পারেন:

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

এর পরে আপনি আপনার অভ্যন্তরীণ ধারণাটি দেখতে পাবেন।

অথবা আপনি চেষ্টা করতে পারেন ... এই জাতীয় বিবৃতি ধরুন: সত্তা ফ্রেমওয়ার্ক হ্যান্ডলিং ব্যতিক্রম


3
হ্যাঁ, এটি প্যাকেজ ম্যানেজার কনসোলের মাধ্যমে আপডেট-ডেটাবেস চালানোর সময় কাজ করে। খুব সহজ!
টম ফার্গুসন

11
আমি এটিকে আমার কনফিগারেশন.সেইড পদ্ধতির শীর্ষে যুক্ত করেছি। এটি এমন একটি পপআপ তৈরি করে যা আপনাকে কোডটি ডিবাগ করার জন্য আপনার ভিজ্যুয়াল স্টুডিও নির্বাচন করতে দেয়। যাইহোক, আমি যখন এটি নির্বাচন করি তখন আমার সিস্টেমটি স্তব্ধ হয়ে যায় (সম্ভবত সম্পর্কিত নয়)।
টালন

3
এই টুকরো কোডটি কোথায় রাখবেন? যদি কেউ সাহায্য করতে পারে! ধন্যবাদ।
অরিত্রা বি

4
আপনার কনফিগারেশন ক্লাসের কনস্ট্রাক্টরে।
কেসি

5
@ ট্যালন গো একটি কফি ধরুন এবং আপনি ফিরে আসার সময় সম্ভবত আরও একটি ভিজ্যুয়াল স্টুডিও উদাহরণ পপ আপ হয়ে যাবে। :)
করটিস্টিয়ান বোর্ম্যান

11

একটি ডিবি স্থানান্তরের একটি ব্রেক পয়েন্ট হিট করার জন্য প্রারম্ভিক অবস্থানে মাইগ্র্যাটড্যাটবেসটোলেস্টেভার্সনে প্রসঙ্গ সেট করুন set

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

তারপরে আপনি কেবল স্বাভাবিক হিসাবে ডিবাগ করুন (এফ 5 ব্যবহার করে চালান) এবং ব্রেকপয়েন্টটি প্রথমবারের মতো আপনি প্রকল্পটি চালাবেন hit

এখন সমস্যাটি হ'ল আপনি যদি দ্বিতীয়বার ডিবাগ করেন তবে মাইগ্রেশন চলবে না। কারণ আপনি সর্বশেষ সংস্করণে স্থানান্তরিত হয়েছেন তা বলতে __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: ডিবাগ আরম্ভ করার জন্য / স্ক্রিপ্টফায়াল প্যারামিটারের সাথে মাইগ্রেশন.এক্সেভ করুন এবং প্রকৃতপক্ষে কাঙ্ক্ষিত ডিবি-মাইগ্রেশন ডিবাগ করুন

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

একবার ডিবাগার-সিলেক্টর ডায়ালগ পপ আপ হয়ে গেলে আপনি ইতিমধ্যে খালি ভিজ্যুয়াল স্টুডিও উদাহরণটি বেছে নিন।


4

আপনি মাইগ্রেশন কোডে কনসোল.উরাইটলাইন স্টেটমেন্ট যুক্ত করতে পারেন (দুর্দান্ত সমাধান নয়)

দ্রষ্টব্য, বার্তাগুলি কেবল তখনই দেখানো হয় যদি আপনি migrate.exeইউটিলিটি (ইন pacakges\EntityFramework.x.y.z\tools) ব্যবহার করে মাইগ্রেশন কোডটি চালান । আপনি প্যাকেজ ম্যানেজার কনসোলের মাধ্যমে মাইগ্রেশন চালনা করলে সেগুলি প্রদর্শিত হবে না।


থ্যাঙ্কস টম ... এটি আমার কাছে সবচেয়ে কাছের উত্তর ছিল। যদি এর থেকে ভাল সমাধানের সাথে কেউ উত্তর না দেয় তবে আমি এটিকে উত্তর হিসাবে চিহ্নিত করব। :)
ড্যানিয়েল

অথবা আপনি ফিরে আসতে চান এমন বার্তাটি দিয়ে একটি ব্যতিক্রম ছুঁড়ে ফেলুন।
ডেভিড ডি সি ই ফ্রেইটাস

2

" ডিবাগার.লানচ ()" ( উপরের এম_ড্যাভিডের উত্তর মত) ব্যবহার করে আমার প্রচুর ভাগ্য হয়েছে তবে ক্রিয়েটডিবি কনটেক্সট-এর অভ্যন্তরে মনে হয় এটি কোনওভাবে সংযুক্ত, এবং সংযুক্তি নয়। আমার অর্থ হ'ল এটি সংযুক্ত করে এবং .asm ফাইল এবং .cpp ফাইলগুলিতে (অভ্যন্তরীণ কোড) প্রবেশ করার চেষ্টা শুরু করে। যদি আমি কোন কনসোলটিতে ব্রেকপয়েন্ট সেট করার চেষ্টা করি W রাইটলাইন যা আমি জানতাম যে পরে মৃত্যুদন্ড কার্যকর হয় (আমি কোনও "ডটনেট ইফ মাইগ্রেশন কম্যান্ড" থেকে আউটপুট দেখতে পারি) এটি উভয়ই এটি সম্পাদন করে এবং ব্রেকপয়েন্টে কখনও আঘাত করে না।

পরিবর্তে আমার পক্ষে এটিই কাজ করেছিল:

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

// Breakpoint after this...

আপনি মাইগ্রেশন নির্বাহ করতে পারেন এবং ম্যানুয়ালি ভিসুয়াল স্টুডিও ব্যবহার সংযুক্ত এবং এটি হবে আসলে আপনি কোড মাধ্যমে পইঠা মত আশা করি এটা শুধু একটা ব্যথা বেশি। আমার যা চেষ্টা করা উচিত তা হ'ল দুটি পদ্ধতির সংমিশ্রণ ...


আপনি কোন প্রক্রিয়া সংযুক্ত করছেন?
এক্সডিএস

-1

ত্রুটির বিবরণ পেতে আমি এখানে একটি ঝরঝরে কৌশলও পেয়েছি ...

মূলত, কৌশলটি হ'ল ব্যতিক্রম থেকে সমস্ত তথ্য দখল করে, একটি স্ট্রিংয়ে রাখে এবং উত্পন্ন স্ট্রিং এবং মূল ব্যতিক্রম সহ একটি নতুন DbEntityValidationException নিক্ষেপ করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.