İlk kod Entity Framework geçiş kodlarında hata ayıklama


138

Web sitemde ilk olarak Entity Framework kodunu kullanıyorum ve sadece geçiş kodlarında hata ayıklamanın herhangi bir yolu olup olmadığını merak ediyorum. Bilirsiniz, kesme noktaları ve bunun gibi şeyler ayarlamak gibi.

Kullanarak veritabanını güncellemek için Paket Yöneticisi Konsolu kullanıyorum Update-Database.

Teşekkürler


Bu sadece standart C # kodu - yani evet, tabii ki, içinde kesme noktaları ayarlayabilirsiniz .....
marc_s

1
ancak Paket Yöneticisi Konsolu'nu kullandığımdan beri uygulama gerçekten çalışmıyor.
Daniel

1
Ardından Paket yöneticisi konsolundan yükseltme yapmayın, ancak uygulamanız ilk kez bağlandığında veritabanının çalışmasını engellemek için geçiş başlatıcısını varsayılan başlatıcı olarak ayarlayın.
Wiktor Zychla

Geçiş kodunu kullanarak veritabanımı güncelliyorum ve uygulamayı durduramıyorum ve başlatıcıyı çalıştırmak için tekrar çalıştıramıyorum.
Daniel

SQL kullanmamanın nedeni, güncelleme kodunun oldukça karmaşık olması ve SQL kullanarak uygulamak neredeyse imkansız.
Daniel

Yanıtlar:


255

EF Kod İlk Geçişlerinin nispeten yeni bir araç olduğunu biliyorum, ancak hala .NET'te olduğunuzu unutmayın.

Böylece şunları kullanabilirsiniz:

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

Bundan sonra InnerException'ınızı görebilirsiniz.

Veya try ... catch deyimini şu şekilde kullanabilirsiniz: İstisna yönetimi Entity Framework


3
Evet, bu paket yöneticisi konsolu üzerinden bir Güncelleme Veritabanı çalıştırırken çalışır. Çok kullanışlı!
Tom Ferguson

11
Bunu Configuration.Seed yöntemimin üstüne ekledim. Kod hatalarını ayıklamak için Visual Studio'yu seçmenizi sağlayan bir açılır pencereye neden olur. Ancak, sistemimi seçtiğimde askıda kalıyor (belki de ilgisiz).
Talon

3
Bu kod parçasını nereye koymalıyım? eğer biri yardım edebilirse! Teşekkürler.
Aritra B

4
Yapılandırma sınıfınızın yapıcısında.
Casey

5
@Talon Go bir kahve alın ve geri döndüğünüzde muhtemelen başka bir Visual Studio örneği ortaya çıktı. :)
Corstian Boerman

11

Bir db geçişinde bir kırılma noktasına vurmak için bağlamı başlangıçta MigrateDatabaseToLatestVersion olarak ayarlayın.

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

Daha sonra normal olarak hata ayıklayın (f5 kullanarak çalıştırın) ve projeyi ilk çalıştırdığınızda kesme noktası vurulacaktır.

Şimdi sorun, ikinci kez hata ayıklama durumunda taşıma çalışmaz olmasıdır. Bunun nedeni, __MigrationHistory tablosunun en son sürüme geçtiğinizi bildirmek üzere güncellenmiş olmasıdır. Taşımayı yeniden test etmek için paket yöneticisi konsolunu açın ve bir önceki taşıma işlemine geçin:

Update-Database TargetMigration: ThePreviousMigrationName

8

Cevabım biraz aptalca olabilir ama yine de burada. Benim gibi, bazı zamanlarda Seed () yönteminde sorun yaşıyorsanız, genellikle yaptığım sadece Tohumu Koru () olarak adlandırılan genel bir yöntem oluşturmaktır.

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

sonra HomeController hata ayıklama modunda bu yöntemi çağırır.

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

Biraz topal bir çözüm olduğunu biliyorum, ama basit ve hızlı. Tabii ki bu model oluşturulduktan sonra yapılmalıdır. Adım adım:

  1. seed yöntemini yorumlayın ve modeli oluşturmak için güncelleme veritabanını yürütün
  2. Seed () yöntemini uncomment ve yukarıda bahsettiğim "hack" eklentisi.

  3. yapılandırmada Otomatik geçişleri devre dışı bırak

    AutomaticMigrationsEnabled = false; // bunu devre dışı bıraktıysanız zaten bu adımı atlayın

  4. Uygulamanızda hata ayıklayın, hatayı düzeltin ve "hack" i kaldırın


5

İşte çok fazla karışıklık olmadan hile yapacak daha başarısız bir yöntem:

1. Adım: Bu kod parçasını hata ayıklamak istediğiniz geçişin hemen üstüne yerleştirin:

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()
    {
    }
}

Adım # 2: Taşımalarınızı içeren projeyi derleyin

Adım # 3: Çıktı dizininin içinde (/ bin / Debug, / bin / Release vb.) Geçişlerinizin dll'sini içeren bir konsol açın

Adım # 4: Hata ayıklayıcıyı başlatmak ve gerçekte istenen db-migration hata ayıklamak için migrate.exe / scriptFile parametresiyle çağırın

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

Hata ayıklayıcı seçici iletişim kutusu açıldığında, daha önce açmış olduğunuz görsel stüdyo örneğini seçin.


4

Taşıma koduna Console.WriteLine ifadeleri ekleyebilirsiniz (mükemmel bir çözüm değil)

İletilerin yalnızca taşıma kodunu migrate.exe(in pacakges\EntityFramework.x.y.z\tools) yardımcı programını kullanarak çalıştırırsanız gösterilir . Taşıma işlemini Paket Yöneticisi konsolu üzerinden çalıştırırsanız görüntülenmezler.


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

Veya iletinizle birlikte dönmek istediğiniz bir İstisna atın.
David d C e Freitas

2

Başka yerde "Debugger.Launch ()" ( yukarıdaki m_david'ın cevabında olduğu gibi) kullanarak şans bir sürü yaşadım , ancak CreateDbContext içinde bir şekilde hem eklemek hem de eklemek gibi görünüyor. Demek istediğim, ekler ve .asm dosyalarına ve .cpp dosyalarına (dahili kod) adım atmaya çalışır. Ben bir Konsol.Writeline daha sonra yürütülür biliyorum bir kesme noktası ayarlamak çalışırsanız (HERHANGİ BİR "dotnet ef geçiş COMMAND" çıktı görebilirsiniz) her ikisi de onu yürütür ve kesme noktasına asla vurur.

Bunun yerine benim için işe yarayan buydu:

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

// Breakpoint after this...

Sen göçü yürütmek ve elle Visual Studio kullanarak saldıran ve bu edebilirsiniz olacak aslında sadece daha fazla bir ağrı var, beklediğiniz gibi kod boyunca adım edelim. Gerçekten denemem gereken her iki yöntemin birleşimidir ...


Hangi sürece bağlısınız?
XDS

-1

Burada da düzgün bir numara buldum hata ayrıntılarını almak için ...

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.