112

Web sitemde önce Entity Framework kodunu kullanıyorum ve yalnızca geçiş kodlarında hata ayıklamanın herhangi bir yolu olup olmadığını merak ediyorum. Bilirsin, ayrılma noktaları ve bunun gibi şeyler koymak gibi.Hata ayıklama kodu ilk Entity Framework geçiş kodları

Veritabanı güncelleştirme veritabanını kullanarak güncelleştirmek için Paket Yöneticisi Konsolu kullanıyorum.

Teşekkür

+0

Sadece standart C# kodu - yani evet, tabii ki, içinde kesme noktaları ayarlayabilirsiniz ..... –

+0

ama uygulama aslında bu yana çalışmıyor Paket Yöneticisi Konsolu'nu kullanıyorum. – Daniel

+1

O halde, Paket yöneticisi konsolundan yükseltme yapmayın, ancak geçiş başlatıcıyı varsayılan başlatıcı olarak ayarlayın; böylece, veritabanınız uygulamaya ilk kez bağlandığında, bu veritabanı birleştirilir. –

cevap

4
Eğer pacakges\EntityFramework.x.y.z\tools içinde ( migrate.exe yardımcı programını kullanarak göç kod çalıştırmasına eğer göç kodu (değil harika bir çözüm)

Not Console.WriteLine ifadeleri ekleyebilir

, mesajlar, sadece). Taşıma işlemini Paket Yöneticisi konsolu üzerinden çalıştırırsanız görüntülenmezler.

+0

Teşekkürler Tom ... Yapabileceğim en yakın cevaptı. Eğer kimse bunu daha iyi bir çözümle cevaplamazsa, onu cevap olarak işaretleyeceğim. :) – Daniel

+0

Veya geri dönmek istediğiniz iletinizle bir Özel Durum atayın. –

216

EF Code First Migrations'ın nispeten yeni bir araç olduğunu biliyorum, ancak hala .NET'te olduğunuzu unutmayın.

Yani kullanabilirsiniz: Bundan sonra

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

Eğer InnerException görebilirsiniz. Böyle

Yoksa denemek kullanabilirsiniz ... catch deyimi: Exception handling Entity Framework

+0

Thx m_david. Bunu test etmek için zamanım olmadı. Bir android projeye yakalandım. MVC web siteme geri dönmek için zamanım olduğunda bunu test edeceğim. – Daniel

+2

Evet, bu paket yöneticisi konsolu aracılığıyla bir Güncelleştirme Veritabanı çalıştırırken çalışır. Çok kullanışlı! –

+9

Bunu Configuration.Seed yöntemimin en üstüne ekledim. Kodu ayıklamak için Visual Studio'yu seçmenize izin veren bir açılır pencereye neden olur. Ancak, sistemimi seçtiğimde (belki ilgisiz) askıda kalıyor. – Talon

12

bir db göçte bir kırılma noktası vurmak için initialize üzerinde MigrateDatabaseToLatestVersion içerik ayarlayın.

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

Sonra sadece normal bir şekilde hata ayıklama (f5 kullanarak çalıştırın) ve kesme noktası, projeyi ilk kez çalıştırdığınızda vuracaktır.

Sorun şu ki, ikinci kez hata ayıklama durumunda geçiş çalışmaz. Bunun nedeni, en son sürüme geçirdiğiniz __MigrationHistory tablosunun güncellenmesidir. gider yine burada

Update-Database –TargetMigration: ThePreviousMigrationName 
+0

İyi bir çözüm, teşekkürler! – magnattic

+0

Bu benim için de çalıştı. Teşekkürler! –

8

Benim cevabım biraz saçma olabilir ama: yeniden deneme için göç paket yöneticisi konsolunu açın ve önceki göçe düşürün. Eğer benim gibi, bazı zamanlar Seed() yönteminde sorun yaşıyorsanız, genellikle yaptığım şey sadece Protect Seed() 'i çağıran bir genel yöntem oluşturmaktır.

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

sonra benim HomeController ben hata ayıklama modunda bu yöntemi diyoruz.

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

Biliyorum bu biraz topal bir çözümdür, ancak basit ve hızlıdır. Elbette bu, model oluşturulduktan sonra yapılmalıdır.

  1. comment tohum yöntemi ve modeli yöntemi Seed (yorumsuz
  2. oluşturun) ve "kesmek" Ben yukarıda belirtilen eklentisi için güncelleme-veritabanını yürütün: Yani adım adım.konfigürasyonda

  3. devre dışı Otomatik göçler

    AutomaticMigrationsEnabled = false; Eğer bu adımı

  4. Debug uygulamanız atlamak hatayı düzeltmek ve çıkarmak zaten bu engelli varsa, "kesmek" //

0

Ben de hata ayrıntılarını almak için düzgün bir hile here ... bulundu

Temel olarak, hile, tüm bilgileri bir istisnadan almak, bir dizeye koymak ve oluşturulan dizge ve özgün istisna ile yeni bir DbEntityValidationException atmaktır.

0

"Debugger.Launch()" (m_david's answer above'da olduğu gibi) kullanarak başka bir yerde çok şansım vardı, ancak CreateDbContext'in içinde her ikisi de eklendiğinde ve bağlanmadığında görünüyor. Demek istediğim, .asm dosyaları ve .cpp dosyalarına (dahili kod) adım atmaya çalışır ve çalışmaya başlar. Bir Console.Writeline üzerinde bir kesme noktası ayarlamaya çalıştığımdan sonra BİLDİĞİM BİLDİRİMİ (çıktıyı HERHANGİ bir "dotnet ef geçişi COMMAND" dan görebilirsiniz) her ikisini de çalıştırır ve kesme noktasını asla vurmaz. Sen göçü yürütmek ve elle Visual Studio kullanarak saldıran ve bu aslında beklediğiniz gibi kod boyunca adım sağlayacak yapabilirsiniz

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

// Breakpoint after this... 

, bu sadece:

Bu yerine benim için çalıştı ne daha çok acı çekiyor. Gerçekten denemeliyim, her iki yöntemin birleşimi ...