Subsonic Vs NHibernate [đã đóng]


77

Vấn đề là gì khi sử dụng một trong những công cụ này đối nghịch với công cụ kia? Tôi thấy Subsonic rất hữu ích về mặt hoàn thành công việc nhanh chóng, nhưng trong các dự án lớn, nó có xu hướng không mở rộng quy mô và nó liên kết mô hình miền của bạn với mô hình cơ sở dữ liệu của bạn. Đó là lúc Nhibernate xuất hiện vì nó cung cấp cho bạn các POCO nhẹ không liên quan đến mô hình cơ sở dữ liệu của bạn, nhưng thời gian thiết lập lâu hơn nhiều.

Câu trả lời:


84

Tôi đã được hỏi câu hỏi này rất nhiều và nó thực sự phụ thuộc vào mức độ bạn muốn chơi. Tôi không thể cho bạn biết những bình luận của Chris Cyvas RE SubSonic có tác hại như thế nào - và tôi đã phản hồi những nhận xét này kể từ đó :(.

Thỏa thuận là - rất khôn ngoan, SubSonic quy mô rất tốt. Về tăng trưởng dự án - BẤT KỲ công cụ nào bạn sử dụng đều cần bạn chú ý. Ngay cả NHibernate.

Tôi đã viết một bài về cách sử dụng mẫu Kho lưu trữ với DI (như bạn làm với NHIb hoặc bất kỳ công cụ nào cho vấn đề đó) với SubSonic 2.1:

http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/

Tôi cũng đã viết một bài về hiệu suất của SubSOnic:

http://blog.wekeroad.com/blog/subsonic-scaling/

Hi vọng điêu nay co ich.


12
Thiên vị hay không, tôi đã dành 4 giờ cuối cùng cố gắng để điều tra đó là dễ dàng hơn để đón và làm việc với và đường cong học tập với cận âm có vẻ rất tối thiểu so với NHibernate ...
RSolberg

1
Tôi hiện đang sử dụng kho lưu trữ đơn giản cận âm cho một dự án, nó thực sự dễ sử dụng nhưng đáng buồn là chậm và khá lỗi. sau khi xem xét một số mã bằng cách sử dụng hồ sơ aroudn 20% thời gian đã dành để nhận các giá trị từ cơ sở dữ liệu và phần còn lại trong chính subsonic. đó là lý do tại sao tôi hiện đang xem xét các giải pháp khác.
kay.one

"Chậm và khá lỗi". Nó giống như nói rằng bình luận này là "ngớ ngẩn và không có nhiều thông tin".

45

Tôi khuyên bạn nên sử dụng SubSonic nếu dự án của bạn hoạt động với dạng xem ActiveRecord mà cơ sở dữ liệu là mô hình của bạn. Bạn sẽ nhận được một lớp cho mỗi bảng và mọi thứ đều hoạt động một cách kỳ diệu. Tất nhiên, bạn có thể điều chỉnh và ghi đè mọi thứ, nhưng nếu bạn (hoặc dự án của bạn) về cơ bản không đồng ý với cách tiếp cận lớp trên mỗi bảng, tôi sẽ xem xét NHibernate vì nó bắt đầu với cách tiếp cận phức tạp hơn (nhưng linh hoạt hơn) để lập bản đồ của bạn mô hình miền vào cơ sở dữ liệu của bạn.

Nếu bạn đang sử dụng một cơ sở dữ liệu tương đối đơn giản nằm trong tầm kiểm soát của bạn (như trong, bạn có thể thay đổi các cột mà không cần gửi tám biểu mẫu đến hội đồng đánh giá giám sát bộ phận cơ sở dữ liệu), tôi khuyên bạn nên bắt đầu với SubSonic và chuyển sang NHibernate nếu SubSonic không đáp ứng nhu cầu của bạn.


31

Đối với những gì giá trị của nó ... Tôi đã có cơ hội sử dụng cả hai công nghệ khá nhiều hơn kể từ khi đặt câu hỏi này. Và tôi phải ở lại nếu những công nghệ này bạn chọn rất ít quan trọng. Chắc chắn NHibernate cho phép các thực thể kinh doanh của bạn ít được kết hợp hơn một chút với cấu trúc cơ sở dữ liệu của bạn, nhưng tôi vẫn thấy rằng có nhiều trường hợp bạn vẫn phải tuân theo ý muốn của cơ sở dữ liệu.

Theo ý kiến ​​của tôi, cách duy nhất đúng để tách hoàn toàn Mô hình miền của bạn khỏi mô hình Cơ sở dữ liệu là viết DTOS của riêng bạn (về cơ bản là POCO để truyền dữ liệu xung quanh), sau đó ánh xạ chúng trở lại ORM bạn chọn trong lớp dữ liệu của bạn. Nhưng trong hầu hết các trường hợp, cách tiếp cận này sẽ khiến tôi gặp nhiều rắc rối hơn giá trị của nó.


13

Hơi lạc đề, nhưng theo một cách tương tự. Bạn đã xem Castle ActiveRecord, nó được viết trên NHibernate và loại bỏ sự cần thiết phải dành thời gian tạo ánh xạ XML từ mã đến cơ sở dữ liệu. Giống như NHibernate, bạn có thể cấu trúc các đối tượng miền của mình như bạn muốn và sau đó tạo một lược đồ cơ sở dữ liệu từ cấu trúc này.

Sử dụng ActiveWriter , một công cụ được đóng góp, bạn có thể dễ dàng ánh xạ từ cơ sở dữ liệu của mình sang các đối tượng miền.


Tôi đang chơi với CAR trong một dự án thử nghiệm. Tôi chọn nó vì tôi thích ý tưởng về ActiveRecord trên một thứ gì đó cũng đã được thử nghiệm như NHibernate. Nếu tôi không thích CAR, tôi có thể quay trở lại NHibernate thuần túy. Điều này cho tôi một lối thoát an toàn - tôi thích điều đó. Tôi sẽ thử Subsonic trong vài tháng nữa để so sánh.
BuddyJoe

9

Bạn có thể cân nhắc xem Fluent NHibernate; nó làm cho việc quản lý NHibernate trở nên dễ dàng. Không chắc việc chuyển đổi một lược đồ hiện có sẽ khó khăn đến mức nào, nhưng nếu bạn đang xây dựng một ứng dụng mới, tốt hơn là bạn nên xác định mô hình miền và tạo cơ sở dữ liệu trong bất kỳ máy chủ DB nào mà bạn có thể nghĩ đến. Từ việc đọc các nhận xét khác ở đây, tôi nghĩ Fluent NHibernate đưa NHibernate ngang hàng với SubSonic để dễ cấu hình.


1
Tôi đồng tình. Tự động hóa của Fluent NHibernate kết hợp với SchemaExport của NHibernate mang lại tất cả các lợi ích của SubSonic mà không có bất kỳ nhược điểm nào.
Aoermatic

7

Tôi không thể đưa ra một so sánh tốt vì tôi chưa thực sự sử dụng NHibernate trong một dự án, nhưng tôi đã sử dụng SubSonic và rất hài lòng với nó. Cho đến nay, tôi đã không gặp bất kỳ trở ngại lớn nào khi sử dụng nó.

Hãy xem bài đăng này từ Rob C office, một trong những người tạo ra SubSonic. Anh ấy nói về cách tách mã SubSonic của bạn khỏi phần còn lại của ứng dụng. Anh ấy thậm chí còn đề cập đến thực tế là kiến ​​trúc này sẽ cho phép bạn sau này hoán đổi SubSonic cho một số lớp truy cập dữ liệu khác như NHibernate hoặc LINQ to SQL.

Tôi biết tôi đã không thực sự trả lời câu hỏi của bạn, nhưng tôi hy vọng điều này vẫn có ích.


7

Tôi đã viết một bài đăng trên blog gần đây về .NET ORMs có Subsonic trong đó và ActiveRecord. Theo kinh nghiệm của tôi, nó phụ thuộc vào những gì dự án đang làm, Subsonic hoạt động tốt hơn rất nhiều nếu bạn đến từ nền tảng SQL nhưng NHibernate có nhiều ưu điểm hơn. ActiveRecord tốt cho các dự án nhỏ hơn, tôi không tin rằng nó nhanh hơn cho các dự án lớn hơn là gắn bó với NHibernate.


Liên kết bạn cung cấp không hoạt động. Bạn có hiểu cái này không? Corays.net/articles/a-look-at-dotnet-orms.aspx
kimsk

5

Tôi đã đánh giá cả hai và tôi tin rằng sẽ không công bằng nếu đề xuất cái này hơn cái kia mà không hiểu mục tiêu của bạn là gì. Trong câu hỏi của bạn, bạn đã nêu rõ sự khác biệt và tôi tin rằng đó cần là yếu tố quyết định của bạn. Cá nhân tôi đã sử dụng cả hai và sẽ tiếp tục sử dụng cả hai tùy thuộc vào dự án.

  • NHibernate là sự lựa chọn của tôi cho các dự án quy mô lớn hơn vì nó sử dụng POCO's nhẹ. Nếu tôi đã từng chuyển ORM của mình "Tôi tin rằng" thì việc tái cấu trúc sẽ dễ dàng hơn nhiều.
  • SubSonic là lựa chọn của tôi khi tôi có một dự án quy mô nhỏ hơn. Tôi tin rằng SubSonic hiệu suất khôn ngoan sẽ cân bằng tốt. Tuy nhiên, tôi cảm thấy gắn bó chặt chẽ với nó vì nó được khắc sâu trong dự án của tôi. Trong dự án nhỏ hơn, tôi vẫn có thể chuyển nó ra vì cơ sở mã quá nhỏ và nó thực sự giúp tôi tách mã như đã quảng cáo.

4

Một lần nữa hơi lạc đề, nhưng tôi sẽ thứ hai Castle ActiveRecord - thay vì sử dụng cơ sở dữ liệu làm mô hình của bạn (cách tiếp cận cận âm) hoặc dành hàng giờ trong món mì Ý XML (cách tiếp cận NHibernate), bạn chỉ cần đặt các thuộc tính trên các lớp mô hình của mình.

Bạn thậm chí có thể nhận ActiveRecord để tạo lược đồ cơ sở dữ liệu cho bạn.

Chúng tôi đã sử dụng phương pháp này trên khá nhiều dự án hiện nay và những lợi ích như sau:

  • Đường dẫn nâng cấp dễ dàng lên NHibernate nếu được yêu cầu trong tương lai
  • Hỗ trợ cho các mô hình kế thừa đơn giản - ví dụ. Xe -> Xe
  • Lược đồ mà nó tạo ra rất có thể là cách bạn đã tạo ra nó, vì vậy bạn có thể dành nhiều thời gian hơn để xây dựng ứng dụng thay vì lo lắng về việc giữ cho mô hình / db của bạn được đồng bộ hóa.

3

Tôi nghĩ bạn đã đóng đinh nó khá nhiều. Subsonic tạo mã, vì vậy các đối tượng kinh doanh của bạn sẽ phản ánh cấu trúc cơ sở dữ liệu của bạn. nHibernate sử dụng các tệp ánh xạ ánh xạ các đối tượng kinh doanh của bạn vào cơ sở dữ liệu để các đối tượng của bạn có thể được cấu trúc theo cách bạn muốn.

Quy mô của một dự án này là bao nhiêu? Có cần hỗ trợ lâu dài không? Hiệu quả chi phí của Subsonic sẽ bù đắp bất kỳ vấn đề mở rộng tiềm ẩn nào không?


3

Chúng tôi đã khởi động bằng cận âm và hiện đang cố gắng đánh giá xem liệu chúng tôi có định chuyển sang nhibernate hay không khi chúng tôi đang ở các điểm đau của cận âm.

Tùy chọn khác của chúng tôi là tạo một số trung gian nơi chúng tôi sử dụng subsonic để truy vấn và tải lên các đối tượng tùy ý với chức năng "thực thi như danh sách được đánh máy" của chúng thực hiện ánh xạ dựa trên tên của câu lệnh sql kiểu linq tùy ý. Hoặc để thử và tạo lại một số nó trong nhibernate và cấu trúc lại phần còn lại.

Vì vậy, tôi nói cận âm có ý nghĩa trong các ứng dụng nhỏ, nhưng việc bảo trì các ứng dụng cận âm trở nên khá khó khăn, chúng tôi đặc biệt gặp khó khăn với mã xác thực chồng chéo và các sự kiện kích hoạt trước / đăng trong mã. Đối với một mẫu bản ghi đang hoạt động, subsonic chắc chắn là 80% ở đó, nhưng thực hiện một cách không ổn định và ngăn bạn có bất kỳ quyền kiểm soát thực sự nào đối với hệ thống phân cấp kế thừa của bạn, vì mọi lớp phải kế thừa một bảng để quay lại bảng đó.


3

Cân nhắc nhóm của bạn và quy mô dự án khi xem xét ActiveRecord.

Theo kinh nghiệm của tôi, ActiveRecord là một phần trừu tượng trên NHibernate bắt đầu rò rỉ như một cái sàng khi thử các kịch bản phức tạp hơn.

Nếu bạn có một lược đồ từ trung bình đến phức tạp hoặc không đơn giản, hãy sử dụng NHibernate. Bạn có thể cắt hạt lựu và cắt hạt lựu.

Một nơi khác mà bạn có thể gặp rắc rối là khi bạn cần một truy vấn phức tạp vừa phải. ActiveRecord ẩn rất nhiều cách triển khai của NHibernate ... nhưng bạn sẽ cần nó cho một truy vấn phức tạp, điều này sẽ trở nên rất khó khăn nếu bạn hoàn toàn không quen với HQL. Hãy cẩn thận, các thành viên trong nhóm đừng chỉ học theo NHibernate và HQL.


2

Nắm bắt sự không phù hợp trở kháng!

kiểm tra cái này

:)

Hoặc không. Nếu bạn muốn hiệu suất, hãy làm điều đó cho mình. Nếu bạn muốn nó nhanh chóng và dễ dàng, hãy sử dụng NHibernate và ActiveRecord. Nếu bạn thích giả vờ rằng bạn thực sự biết những gì đang xảy ra ở cấp độ truy cập dữ liệu, hãy sử dụng NHibernate và ngồi với XML cả ngày để có được nhiều thứ ... Hoặc chỉ ... ờ .. tự làm điều đó - ADO.Net FTW!


Stephen Forte cũng vậy, hiện nay (tính đến tháng 12 năm 2010) nói rằng "Khi thế hệ công cụ ORM mới nổi ngày nay tiếp tục phát triển, chúng ngày càng trở nên nhanh nhẹn hơn và dễ sử dụng hơn, khiến nhiều nhà phát triển xem xét lại việc tích hợp ORM vào kiến ​​trúc ứng dụng của họ ". Không có gì bằng thời gian để làm cho một người đàn ông cảm thấy của mình! :-) devproconnections.com/article/tools-and-products/…
rsenna

2

Tôi tin rằng bạn nên gắn bó với cái mà bạn có thể sử dụng tốt nhất. Mục tiêu cuối cùng là năng suất và mã chất lượng hoạt động tốt. Nếu bạn biết SubSonic trong và ngoài thì hãy bám vào nó và nếu bạn biết sâu về NHibernate thì hãy bám vào NHibernate. Đây là câu hỏi rất chủ quan. Bạn cũng nên xem xét thực tế là thành viên trong nhóm của bạn có chuyên môn về lĩnh vực nào. Nếu bạn giỏi nó, bạn sẽ có thể dễ dàng duy trì nó.

Tôi đã thấy các dự án lớn sử dụng SubSonic trong khi NHibernate đã nổi tiếng và được sử dụng rộng rãi.

Quyết định chọn ORM không chỉ phụ thuộc vào chính ORM.


0

Lời khuyên mà tôi đã nhận được về chủ đề này là Subsonic không mở rộng quy mô để xử lý các tình huống phức tạp hơn và vì vậy nếu bạn đi theo con đường đó, bạn sẽ kết thúc với một công việc cố gắng chuyển sang một ORM nâng cao hơn.

Do đó, tôi quan tâm hơn đến việc sử dụng NHibernate cho các trường hợp phức tạp, Castle Active Record cho các trường hợp đơn giản hơn và tôi đang theo dõi Fluent NHibernate, điều này sẽ làm cho việc ánh xạ NHibernate dễ dàng hơn rất nhiều (đặc biệt khi hỗ trợ ánh xạ dựa trên quy ước được cải thiện).


1
"rằng Subsonic không mở rộng quy mô để xử lý các tình huống phức tạp hơn" Vấn đề với điều này là chỉ nói rằng nó không có nghĩa là gì. Vẫn còn thiếu hoàn toàn bằng chứng đáng tin cậy cho thấy SS không mở rộng quy mô. Tôi đoán đó là bằng chứng cho thấy đôi khi chỉ cần nói điều gì đó trên Internet là đủ.
CarmineSantini

Nếu bạn có bằng chứng về vấn đề cạo vôi răng cận âm, vui lòng cung cấp. Cá nhân tôi chưa gặp bất kỳ vấn đề nào với khả năng mở rộng SubSonic.
Jim Geurts
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.