2013-03-12 25 views
6

Gọi các phương thức xây dựng của FluentMigrator trong khi bên trong hành động mà tôi chuyển đến Execute.WithConnection gây ra một ngoại lệ tham chiếu null.Gọi các phương thức FluentMigrator bên trong Execute.WithConnection action

Điều tôi đang cố làm là chọn một số dữ liệu để tôi có thể thao tác trong C#, điều đó dễ dàng hơn thao tác trong T-SQL và sử dụng kết quả của các hoạt động C# của tôi để cập nhật dữ liệu hoặc chèn mới dữ liệu (cụ thể hơn, tôi cần phải chọn một tham số chuỗi truy vấn trong chuỗi url được lưu trữ và chèn nó vào một nơi khác).

Cách duy nhất tôi thấy để chọn dữ liệu trong di chuyển là sử dụng Execute.WithConnection và tự truy xuất dữ liệu (FluentMigrator không cung cấp trợ giúp cho việc chọn dữ liệu), nhưng nếu tôi cố gắng sử dụng bất kỳ biểu thức di chuyển thông thạo nào trong hành động tôi chuyển đến Execute.WithConnection ngoại lệ tham chiếu null bị ném.

Đây là một phiên bản luộc xuống mã của tôi:

[Migration(1)] 
public class MyMigration : Migration 
{ 
    public void Up() 
    { 
    Execute.WithConnection(CustomDml); 
    } 

    public void CustomDml(IDbConnection conn, IDbTransaction tran) 
    { 
    var db = new NPoco.Database(conn).SetTransaction(tran); // NPoco is a micro-ORM, a fork of PetaPoco 
    var records = db.Fetch<Record>("-- some sql"); // this is immediately evaluated, no reader is left open 
    foreach (var r in records) { 
     var newValue = Manipulate(r.OriginalValue); 
     Insert.IntoTable("NewRecords").Row(new { OriginalValueId = r.Id, NewValue = newValue }); // <-- this line causes the exception 
    } 
    } 

    public void Down() {} 
} 

Dòng mà các cuộc gọi Inser.IntoTable gây ra một ngoại lệ null để được ném từ dòng 36 của FluentMigrator\Builders\Insert\InsertExpressionRoot.cs - dường như biến _context thể được null tại thời điểm này nhưng tôi không hiểu tại sao lại như vậy. (khi thử nghiệm Create.Table, ví dụ: nó xảy ra trên dòng 49 của FluentMigrator\Builders\Create\CreateExpressionRoot.cs)

Bất kỳ trợ giúp nào sẽ được đánh giá cao. Có lẽ có sự không đồng ý về việc liệu DML có thích hợp trong việc di cư hay không, và tôi mở cửa cho các đề xuất, nhưng kịch bản này đã tăng lên hai lần trong tuần này một mình. Bây giờ tôi chỉ đơn giản là thực hiện chèn bằng cách sử dụng vi-ORM của tôi trong hành động chứ không phải là FluentMigrator và điều đó không hoạt động, nhưng có vẻ như những gì tôi đang cố gắng làm nên hoạt động.

Trả lời

3

Khi sử dụng biểu thức Execute.WithConnection, tất cả những gì bạn nhận được là kết nối db và giao dịch.

Sử dụng Execute.WithConnection tạo biểu thức PerformDBOperationExpression. Khi xử lý biểu thức, bộ xử lý gọi thuộc tính Hoạt động (an example in the SqlServerProcessor) và bộ xử lý không có tham chiếu đến MigrationContext. Nhưng ngay cả khi nó đã có quyền truy cập vào MigrationContext, khi FluentMigrator đã đến giai đoạn xử lý, nó đã quá muộn. Bạn sẽ cố gắng xử lý các biểu thức trong một biểu thức và tại thời điểm FluentMigrator không được xây dựng để xử lý kiểu lồng đó.

Một thay thế sẽ làm cho các chuỗi kết nối có sẵn trong bối cảnh di cư, xem vấn đề này: https://github.com/schambers/fluentmigrator/issues/240

Đó có phải là một cách tiếp cận tốt hơn?

+0

Tôi không nghĩ chuỗi kết nối sẽ tốt hơn, bởi vì sử dụng các tham số được truyền trong Execute.WithConnetion cho phép tôi chạy các hoạt động của mình bên trong cùng một giao dịch. Tôi đã nghĩ rằng đó là một hạn chế của biểu thức hoạt động làm tổ, vì vậy tôi sẽ chỉ đơn giản là gắn bó với việc sử dụng các phương pháp thay thế của dml bên trong WithConnection. Cảm ơn bạn. –

+1

Có, điều đó sẽ hữu ích. Ngay bây giờ, Execute.WithConnection đang thực hiện theo thứ tự với chèn của tôi, và tôi cần phải truy vấn DB cho một số giá trị tra cứu được sử dụng để gieo hạt dữ liệu thử nghiệm. –

Các vấn đề liên quan