Mã gỡ lỗi Mã di chuyển khung thực thể đầu tiên


138

Tôi đang sử dụng mã Entity Framework đầu tiên trong trang web của mình và tôi chỉ tự hỏi liệu có cách nào để gỡ lỗi mã di chuyển không. Bạn biết đấy, như thiết lập các điểm dừng và những thứ như thế này.

Tôi đang sử dụng Gói quản lý gói để cập nhật cơ sở dữ liệu bằng cách sử dụng Update-Database.

Cảm ơn


Đó chỉ là mã C # tiêu chuẩn - vì vậy, tất nhiên, bạn có thể đặt điểm dừng trong đó .....
marc_s

1
nhưng ứng dụng không thực sự chạy vì tôi đang sử dụng Gói quản lý gói.
Daniel

1
Sau đó, không nâng cấp từ bảng điều khiển Trình quản lý gói mà đặt trình khởi tạo di chuyển làm trình khởi tạo mặc định để cơ sở dữ liệu được di chuyển lần đầu tiên khi ứng dụng của bạn kết nối với nó.
Wiktor Zychla

Tôi đang cập nhật cơ sở dữ liệu của mình bằng cách sử dụng mã di chuyển và tôi không thể dừng ứng dụng và chạy lại để chạy trình khởi tạo.
Daniel

Lý do tôi không sử dụng SQL là mã để cập nhật khá phức tạp và gần như không thể thực hiện được bằng SQL.
Daniel

Câu trả lời:


255

Tôi biết rằng Chuyển đổi đầu tiên của Mã EF là công cụ tương đối mới nhưng đừng quên bạn vẫn đang ở trong .NET.

Vì vậy, bạn có thể sử dụng:

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

Sau đó, bạn có thể thấy InternalException của bạn.

Hoặc bạn có thể sử dụng thử ... bắt câu lệnh như thế này: Xử lý ngoại lệ Entity Framework


3
Có, điều này hoạt động trong khi chạy Cập nhật cơ sở dữ liệu thông qua bảng điều khiển trình quản lý gói. Rất tiện dụng!
Tom Ferguson

11
Tôi đã thêm phần này vào đầu phương thức Cấu hình. Nó gây ra một cửa sổ bật lên cho phép bạn chọn Visual Studio để gỡ lỗi mã. Tuy nhiên, hệ thống của tôi bị treo khi tôi chọn nó (có lẽ không liên quan).
Talon

3
Nơi để đặt đoạn mã này? nếu ai có thể giúp đỡ Cảm ơn.
Aritra B

4
Trong constructor của lớp cấu hình của bạn.
Casey

5
@Talon Đi lấy một tách cà phê và vào lúc bạn quay lại có lẽ một ví dụ Visual Studio khác đã xuất hiện. :)
Corstian Boerman

11

Để đạt điểm dừng trong di chuyển db, đặt bối cảnh thành MigrateDatabaseToLatestVersion khi khởi tạo.

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

Sau đó, bạn chỉ cần gỡ lỗi như bình thường (chạy bằng f5) và điểm dừng sẽ chạm vào lần đầu tiên bạn chạy dự án.

Vấn đề bây giờ là nếu bạn gỡ lỗi lần thứ hai, di chuyển sẽ không chạy. Điều này là do bảng __MigrationHistory đã được cập nhật để nói rằng bạn đã chuyển sang phiên bản mới nhất. Để kiểm tra lại quá trình di chuyển, hãy mở bảng điều khiển trình quản lý gói và hạ cấp xuống lần di chuyển trước:

Update-Database TargetMigration: ThePreviousMigrationName

8

Câu trả lời của tôi có thể là một chút ngớ ngẩn nhưng dù sao ở đây nó đi. Nếu bạn cũng như tôi, đôi khi gặp vấn đề trong phương thức Seed (), điều tôi thường làm chỉ đơn giản là tạo một phương thức công khai gọi là Bảo vệ Seed ().

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

sau đó trong HomeContoder của tôi, tôi gọi phương thức này trong chế độ Gỡ lỗi.

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

Tôi biết đó là một giải pháp hơi khập khiễng, nhưng nó đơn giản và nhanh chóng. Tất nhiên điều này phải được thực hiện sau khi mô hình được tạo ra. Vì vậy, từng bước:

  1. nhận xét phương thức seed và thực hiện cơ sở dữ liệu cập nhật để tạo mô hình
  2. bỏ ghi chú phương thức Seed () và bổ sung "hack" mà tôi đã đề cập ở trên.

  3. trong cấu hình, vô hiệu hóa di chuyển tự động

    AutomaticMigationsEnables = false; // nếu bạn bị vô hiệu hóa này đã bỏ qua bước này

  4. Gỡ lỗi ứng dụng của bạn, sửa lỗi và xóa "hack"


5

Đây là một phương pháp không chứng minh hơn sẽ thực hiện thủ thuật mà không cần bận tâm nhiều:

Bước # 1: Đặt đoạn mã này ngay phía trên di chuyển mà bạn muốn gỡ lỗi:

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

Bước # 2: Biên dịch dự án có chứa các di chuyển của bạn

Bước # 3: Mở bảng điều khiển bên trong thư mục đầu ra (/ bin / Gỡ lỗi, / bin / Phát hành, v.v.) có chứa dll di chuyển của bạn

Bước # 4: Gọi Migrate.exe với tham số / scriptFile để khởi chạy trình gỡ lỗi và thực sự gỡ lỗi db-di chuyển mong muốn

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

Khi hộp thoại trình gỡ lỗi chọn bật lên, chọn phiên bản studio trực quan mà bạn đã mở.


4

Bạn có thể thêm các câu lệnh Console.WriteLine vào mã di chuyển (không phải là một giải pháp tuyệt vời)

Lưu ý, các thông báo chỉ được hiển thị nếu bạn chạy mã di chuyển bằng migrate.exetiện ích (trong pacakges\EntityFramework.x.y.z\tools). Chúng sẽ không hiển thị nếu bạn chạy di chuyển thông qua bảng điều khiển Trình quản lý gói.


Cảm ơn Tom ... Đó là câu trả lời gần nhất mà tôi có thể nhận được. Nếu không ai trả lời câu hỏi này bằng một giải pháp tốt hơn thì tôi sẽ đánh dấu nó là câu trả lời. :)
Daniel

Hoặc ném Ngoại lệ với thông điệp của bạn mà bạn muốn trả lại.
David d C e Freitas

2

Tôi đã gặp rất nhiều may mắn khi sử dụng "Debugger.Launch ()" (như trong câu trả lời của m_david ở trên ) ở nơi khác, nhưng bên trong CreatDbContext dường như cả hai đều đính kèm và không đính kèm. Ý tôi là, nó đính kèm và bắt đầu cố gắng bước vào các tệp .asm và .cpp (mã nội bộ). Nếu tôi cố gắng thiết lập một điểm dừng trên Bảng điều khiển. Đường dẫn mà tôi BIẾT sẽ được thực thi sau đó (tôi có thể thấy đầu ra từ BẤT K "" di chuyển dotnet ef "), cả hai đều thực thi nó và không bao giờ chạm đến điểm dừng.

Đây là những gì làm việc cho tôi thay vào đó:

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

// Breakpoint after this...

Bạn có thể thực hiện di chuyển và đính kèm thủ công bằng Visual Studio và nó thực sự sẽ cho phép bạn bước qua mã như bạn mong đợi, điều đó chỉ là một nỗi đau. Điều tôi thực sự nên thử là sự kết hợp của cả hai phương pháp ...


Bạn đang gắn vào quá trình nào?
XDS

-1

Tôi cũng tìm thấy một mẹo gọn gàng ở đây để có được các chi tiết lỗi ...

Về cơ bản, mẹo là lấy tất cả thông tin từ một ngoại lệ, đặt nó vào một chuỗi và ném DbEntityValidationException mới với chuỗi được tạo và ngoại lệ ban đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.