Một số lợi ích của một Micro Micro-ORM 'là gì?


21

Tôi đã xem xét cái gọi là "Micro ORM" như Dapper và (ở mức độ thấp hơn vì nó dựa trên .NET 4.0) vì chúng có thể dễ dàng thực hiện tại nơi làm việc hơn so với ORM toàn diện kể từ hệ thống hiện tại của chúng tôi rất phụ thuộc vào các thủ tục được lưu trữ và sẽ yêu cầu tái cấu trúc đáng kể để làm việc với ORM như NHibernate hoặc EF. Lợi ích của việc sử dụng một trong những thứ này trên ORM đầy đủ tính năng là gì? Có vẻ như chỉ là một lớp mỏng xung quanh kết nối cơ sở dữ liệu vẫn buộc bạn phải viết SQL thô - có lẽ tôi đã sai nhưng tôi luôn được cho biết lý do ORM ở nơi đầu tiên là vì vậy bạn không phải viết SQL, nó có thể được tạo tự động; đặc biệt đối với các phép nối nhiều bảng và ánh xạ các mối quan hệ giữa các bảng là một vấn đề khó thực hiện trong SQL thuần túy nhưng tầm thường với ORM.

Chẳng hạn, nhìn vào một ví dụ về Dapper:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

Làm thế nào khác với việc sử dụng lớp dữ liệu ADO.NET được điều khiển, ngoại trừ việc bạn không phải viết lệnh, đặt tham số và tôi cho rằng ánh xạ lại thực thể bằng Builder. Có vẻ như bạn thậm chí có thể sử dụng một cuộc gọi thủ tục được lưu trữ dưới dạng chuỗi SQL.

Có những lợi ích hữu hình nào khác mà tôi đang thiếu ở đây khi sử dụng Micro ORM hợp lý không? Tôi không thực sự thấy cách nó tiết kiệm bất cứ thứ gì qua cách sử dụng ADO.NET "cũ" ngoại trừ có thể một vài dòng mã - bạn vẫn phải viết để tìm ra SQL nào bạn cần thực thi (có thể có lông) và bạn vẫn phải ánh xạ mối quan hệ giữa các bảng (phần mà IMHO ORM giúp ích nhiều nhất).


+1: Bạn vẫn sẽ cần một ngôn ngữ truy vấn bất kể là gì, vì vậy bạn cũng có thể gắn bó với thứ gì đó quen thuộc như linq hoặc sql, nhưng trả về các loại ẩn danh như trong ví dụ của bạn dường như không ánh xạ mô hình quan hệ đến một miền được cụ thể hóa mô hình. Điều đó thật kỳ quặc với tôi.
Steven Evers

Vâng, tôi không thể tìm thấy một ví dụ cụ thể về Dapper, trên trang web cho nó theo nghĩa đen var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });và sau đó dog.First().Agetruy cập các thuộc tính.
Wayne Molina

5
Ví dụ không trả về loại ẩn danh, từ khóa "var" có thể được sử dụng thay cho loại cụ thể trong C # để lưu kiểu gõ thêm, truy vấn đó sẽ trả về IEnumerable <Person>.
Ed James

1
Lý do chính là ít chi phí phải liên tục kiểm tra các sprocs và sau đó nhớ cập nhật khoảng hai chục tệp SQL, chưa kể đến việc phải lưu trữ procs cho mã CRUD tầm thường.
Wayne Molina

2
Lợi ích chính của việc không sử dụng sprocs để giữ tất cả mã (và tôi sử dụng mã có chủ đích ở đây, bao gồm SQL và các ngôn ngữ khác bạn chọn) trong cùng hệ thống kiểm soát phiên bản. Tôi chưa bắt gặp một cơ sở dữ liệu chéo DB tốt.
Ed James

Câu trả lời:


12

Lợi ích:

  • Hiệu suất tương tự như một SqlCommand thô với DataReader và phân tích cú pháp.
  • Không cần phải cuộn lớp chuyển đổi của riêng bạn cho DataReader.

Đó là khá nhiều, thành thật mà nói. Bạn đã có một trình bao bọc rất nhẹ cho các kết nối sql của bạn sẽ thực hiện chuyển đổi đối tượng cho bạn. Rõ ràng, bạn có thể tinh chỉnh các truy vấn mà không phải đối phó với bất kỳ SQL tự động nào.

Nhược điểm:

  • Thậm chí không hơi an toàn. Nếu bạn mắc lỗi đánh máy trong SQL, máy chủ CI của bạn sẽ không bắt được nó, bạn sẽ phải hy vọng nó bị bắt trong khi kiểm tra giao diện người dùng hoặc chức năng tự động.
  • Một nỗi đau để duy trì. Bạn đã có một loạt các câu lệnh SQL nội tuyến thực hiện các truy vấn khác nhau không có mối quan hệ chặt chẽ với kiến ​​trúc DB. Điều này khá dễ dẫn đến các truy vấn bị "bỏ lại phía sau" khi cấu trúc DB cơ bản thay đổi, một lần nữa, bạn sẽ không thấy tại thời điểm xây dựng.

Chúng có vị trí của chúng và chúng là một công cụ rất hiệu quả có thể lấy đi một số "công việc lừa" từ các nhà phát triển khi tương tác với DB, nhưng thực tế chúng chỉ đơn giản là không thể thay thế ORM ở bất kỳ quy mô lớn nào hệ thống cho các truy vấn không quan trọng về hiệu năng, đơn giản là do chi phí bảo trì tăng.

Nếu bạn đang vật lộn với hiệu năng trên các truy vấn DB, tôi khuyên bạn nên sử dụng các khung ánh xạ này với Chỉ các thủ tục được lưu trữ, để có được một dấu hiệu thời gian biên dịch xem liệu SQL của bạn có hợp lệ hay không (cộng với các lợi ích hiệu suất bổ sung) .


Có những thư viện có thể được sử dụng như một trình bao bọc cho các orms vi mô này có thể làm giảm vấn đề bạn đang đề cập với lỗi chính tả. Ví dụ: Tiện ích bổ sung Crud đơn giản cho Dapper
Srivathsa Harish Venkataramana

3

Trong trang web của micro ORM PetaPoco , ông giải thích một số lợi thế với các ORM khác. để giải thích thêm

PetaPoco là một ORM micro-file nhỏ, nhanh, đơn cho .NET và Mono.

  • Giống như Massive, đây là một tệp duy nhất mà bạn dễ dàng thêm vào bất kỳ dự án nào
  • Không giống như Massive, nó hoạt động với POCO được gõ mạnh
  • Giống như Massive, giờ đây nó cũng hỗ trợ cả Expandos động - đọc thêm
  • Giống như ActiveRecord, nó hỗ trợ mối quan hệ chặt chẽ giữa đối tượng và bảng cơ sở dữ liệu
  • Giống như SubSonic, nó hỗ trợ tạo các lớp poco với các mẫu T4
  • Giống như Dapper, nó nhanh vì sử dụng phương thức tạo phương thức động (MSIL) để gán giá trị cột cho các thuộc tính

1

Làm thế nào khác với việc sử dụng lớp dữ liệu ADO.NET được điều khiển, ngoại trừ việc bạn không phải viết lệnh, đặt tham số và tôi cho rằng ánh xạ lại thực thể bằng Builder. Có vẻ như bạn thậm chí có thể sử dụng một cuộc gọi thủ tục được lưu trữ dưới dạng chuỗi SQL.

Tôi tin rằng đó là lợi ích chính của Micro-ORM, để có được những lợi ích khác của ORM, bạn sẽ cần phải sử dụng toàn bộ. Điều đó và mã tương đối nhỏ hơn, vì vậy nếu bạn cần tùy chỉnh nó, điều đó sẽ dễ dàng hơn.

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.