2012-05-22 30 views
6

Về cơ bản, tôi muốn sử dụng cú pháp Dapper "đẹp" cho quy trình được lưu trữ mà không cần phải sử dụng thủ công exec MySproc @p1, @p2, @p3, @p4 và như vậy, nhưng tôi cần có khả năng truyền trong đối tượng được nhập mạnh với các thuộc tính khác nhau và có đối tượng này được sử dụng để ánh xạ các tham số. Tôi biết tôi có thể làm điều này với một đối tượng ẩn danh, nhưng kịch bản mà tôi nghĩ đến sẽ giống như một dạng tìm kiếm phức tạp, trong đó một số trường có thể được tìm kiếm, và thủ tục lưu trữ tương ứng có thể có khá nhiều tham số.).Dapper có hỗ trợ các đối tượng được nhập mạnh mẽ với quy trình được lưu trữ không?

Lý tưởng nhất là tôi muốn để có thể làm điều gì đó như thế này:

var cust = new Customer(); 
cust.FirstName = ... 
cust.LastName = ... 

// using .NET 3.5 so need to use ugly syntax :(
var result = connection.Query<Customer>("MySproc", cust, null, false, null, CommandType.StoredProcedure).Single(); 
tuy nhiên

, điều đó không làm việc và ném một lỗi bởi vì đối tượng khách hàng của tôi có thể có một chục hoặc tài sản hơn, và tôi 'm chỉ tìm kiếm hai trong trường hợp này; Dapper dường như chỉ kiểm tra mọi thuộc tính và gán một giá trị, giả sử có một tham số tương ứng trong sproc khi có thể không có.

Tôi có thể làm một cái gì đó tương tự như thế này bằng cách sử dụng PetaPoco (vượt qua đối tượng được gõ mạnh hoặc một đối tượng ẩn danh) nhưng tôi đang tìm kiếm một chút trừu tượng hơn PetaPoco.

Là những gì tôi muốn làm trong Dapper (hoặc một vi ORM khác? Tôi không thể sử dụng NHibernate hoặc một ORM nặng), hoặc có cách tôi xem xét để có được cùng một chức năng ngắn của việc phải viết một exec tuyên bố với những gì có thể là một tá tham số?

Trả lời

9

Nếu bạn muốn xác định params bạn sẽ cần phải làm như vậy một cách rõ ràng:

var result = connection.Query<Customer>("MySproc", 
    new {cust.Id, cust.Name}, // specify the params you want to give it. 
    null, 
    false, 
    null, 
    CommandType.StoredProcedure).Single(); 

Chúng tôi không làm một sp_help params sniff cho procs dù bạn có khả năng có thể xây dựng một helper nào đó và cho phép bạn để chạy: cust.ToProcParams('MySproc')

Hoặc, nếu bạn muốn tạo tham số động này, bạn có thể sử dụng.

var dp = new DynamicParameters(); 
dp.Add("Id", cust.Id); 
dp.Add("Name", cust.Name); 
var result = connection.Query<Customer>("MySproc", 
     dp, 
     null, 
     false, 
     null, 
     CommandType.StoredProcedure).Single(); 
+0

Đó là những gì tôi đã sợ, vì việc sử dụng các đối tượng ẩn danh ngăn cản tôi xây dựng một đối tượng động dựa trên đầu vào. Tuy nhiên, ý tưởng của phương thức trợ giúp là thú vị. –

+1

@WayneM xem chỉnh sửa của tôi ... –

+0

Bây giờ có vẻ thú vị. Tôi sẽ phải chơi với nó và xem nó hoạt động ra sao. Nhiều đánh giá cao, Sam! –

2

Nếu bạn đang sử dụng SQL Server, hãy kiểm tra Insight.Database. https://github.com/jonwagner/Insight.Database/wiki Nó hướng đến các thủ tục được lưu trữ và sử dụng SqlDeriveParameters để xác định ánh xạ giữa các đối tượng và các thủ tục được lưu trữ.

LƯU Ý: hiện tại nó yêu cầu .NET 4.0, nhưng nếu bạn thực sự quan tâm đến phiên bản .NET 3.5, tôi có thể thấy mức độ khó khăn như thế nào.

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