2013-07-29 26 views
12

Tôi đang cố gắng sử dụng dapper-dot-net để tăng tốc độ một số khu vực của ứng dụng MVC asp.net của tôi. Tôi cũng đang sử dụng EF5 Code.Tôi có thể sử dụng dapper-dot-net với Entity Framework không?

Kể từ đoan trang-dot-net chỉ là một số phần mở rộng cho IDbConnection, tôi có thể chỉ cần sử dụng

DbContext.Database.Connection 

sử dụng hoạt bát-dot-net? Tôi kiểm tra nó đang hoạt động. Tuy nhiên, tôi không chắc chắn đây là cách đúng để sử dụng nó? Đặc biệt, khi tôi sử dụng như vậy, khung Entity sẽ vẫn có một số tác động có thể làm tổn hại đến hiệu suất?

Trả lời

6

Có, bạn có thể sử dụng theo cách đó. Vì Dapper chỉ làm việc trên các phương thức mở rộng, bạn có thể sử dụng nó cho các vùng nhạy cảm về hiệu suất của mã của bạn. Và bạn có thể tiếp tục sử dụng EF cho các khu vực khác của mã của bạn. Các truy vấn mà bạn có vẫn đang sử dụng EF sẽ không nhanh - nhưng ít nhất các truy vấn sử dụng Dapper sẽ nhanh hơn.

+0

Dựa trên trải nghiệm khó khăn, bằng "nhanh hơn", chúng tôi có nghĩa là "hai hoặc ba đơn đặt hàng có cường độ nhanh hơn". Tôi đã có một truy vấn được tối ưu hóa cao trong Khung thực thể mất 10 phút, sau khi chuyển đổi sang Dapper, mất một phần nhỏ giây để hoàn thành truy vấn 20x kích thước và độ phức tạp: http://stackoverflow.com/questions/9350467/how- do-i-ghi-một-nhiều-truy vấn-trong-dapper-net/30080951 # 30080951. – Contango

+0

@Contango Có phải đó là với AsNoTracking của EF không? –

+0

@Ian Warburton Không chắc chắn - nhưng bất kể, hiệu suất của Dapper rời khỏi Entity Framework trong bụi. Dapper chủ yếu hướng tới đọc dữ liệu, vì vậy nếu bạn muốn viết vào cơ sở dữ liệu, thì tôi đoán Entity Framework sẽ hoạt động nếu một người hài lòng với hiệu suất không hiệu quả, tầm thường có thể hỗ trợ 10 người dùng đồng thời. – Contango

11

Sử dụng Dapper có thể là cải thiện hiệu suất đáng kể trong một số trường hợp nhất định.

Bạn có thể chia sẻ kết nối EF với Dapper. Tuy nhiên (mặc dù không có vấn đề gì), bạn nên chú ý đến các vấn đề tương tranh (ví dụ: do các nỗ lực liên kết nhiều trình đọc dữ liệu với cùng một kết nối).

Nếu bạn gặp sự cố như vậy, bạn có tùy chọn cấp kết nối mới cho Dapper bằng chuỗi kết nối (DbContext.Database.Connection.ConnectionString), thay vì chia sẻ kết nối.

+2

Trong khi * true *, đây không phải là vấn đề trong hầu hết các trường hợp - luồng * chắc chắn * không phải là yếu tố, do đó chủ yếu để lại nguy cơ có một trình đọc dữ liệu mở - đó là khá dễ phát hiện (các lỗi không phải là rất tinh tế) –

+4

@ MarcGravell Tôi sẽ đưa từ của bạn cho nó :) Nhưng không phải là nó chỉ an toàn hơn để luôn luôn cung cấp cho Dapper kết nối riêng của mình (thay vì sử dụng một EF)? Hay có bất lợi khi làm như vậy? –

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