2011-08-04 32 views
6

Tôi có một ứng dụng web với:Khung thực thể - phù hợp với ứng dụng Cấp Doanh nghiệp không?

  • 1 Terabyte DB
  • 200 bảng
  • Ít nhất 50 bảng với 1+ triệu bản mỗi
  • 10+ phát triển
  • 1000s của người dùng đồng thời

Dự án này hiện đang sử dụng Ad-Hoc Sql, được tạo bằng giải pháp ORM tùy chỉnh. Thay vì hỗ trợ ORM tùy chỉnh (thiếu nhiều tính năng nâng cao), tôi đang nghĩ để chuyển sang Entity Framework.

Tôi đã sử dụng EF 4.1 (Code-First) trên một dự án nhỏ hơn và nó hoạt động khá tốt, nhưng nó có thể mở rộng cho một dự án lớn hơn nhiều không?

Trả lời

8

I (cao) đồng ý với marvelTracker (và Ayende của) những suy nghĩ.

Dưới đây là một số thông tin mặc dù:

Chiến lược chính

Có một chi phí nổi tiếng khi sử dụng GUIDs như Primary Keys.Nó được mô tả bởi Jimmy Nilsson và nó đã được công bố công khai tại http://www.informit.com/articles/article.aspx?p=25862. NHibernate hỗ trợ chiến lược khóa chính GUIDCOMB. Tuy nhiên, để đạt được điều đó trong EntityFramework thì hơi phức tạp và yêu cầu các bước bổ sung.

Enums

EntityFramework không hỗ trợ enums natively. Cho đến CTP tháng sáu thêm hỗ trợ cho Enums http://blogs.msdn.com/b/adonet/archive/2011/06/30/walkthrough-enums-june-ctp.aspx cách duy nhất để lập bản đồ enumerations đã sử dụng cách giải quyết Hãy nhìn vào: How to work with Enums in Entity Framework?

Queries:

NHibernate cung cấp nhiều cách để truy vấn dữ liệu:

  • LINQ (sử dụng nhà cung cấp dịch vụ tái cấp phép của chuyển động lại, https://www.re-motion.org/web/)
  • Truy vấn được đặt tên được đóng gói trong đối tượng truy vấn
  • ICriteria/QueryOver đối với các truy vấn không biết trước các tiêu chí
  • Sử dụng QueryOver projections and aggregates (Trong trường hợp, chúng tôi chỉ cần các thuộc tính cụ thể của một thực thể. Trong các trường hợp khác, chúng tôi có thể cần kết quả của hàm tổng hợp, chẳng hạn như số trung bình hoặc số):
  • PagedQueries: Để tránh áp đảo người dùng và tăng khả năng phản hồi của ứng dụng, tập hợp kết quả lớn thường được chia thành các trang nhỏ hơn các kết quả.
  • MultiQueries kết hợp một số truy vấn ICriteria và QueryOver vào một vòng tròn cơ sở dữ liệu đơn lẻ
  • Truy vấn tách biệt là đối tượng truy vấn trong các phần của ứng dụng mà không truy cập vào phiên NHibernate. Các đối tượng này sau đó được thực hiện ở nơi khác với một phiên. Điều này là tốt bởi vì chúng ta có thể tránh các kho lưu trữ phức tạp với nhiều phương thức.

ISession của QueryOver:

// Query that depends on a session: 
premises = session.QueryOver<Premise>().List(); 

tách rời QueryOver:

// Full reusable query! 
var query = QueryOver.Of<Premise>(); 

// Then later, in some other part of ther application: 
premises = query.GetExecutableQueryOver(session).List(); // Could pass IStateleSession too. 

nguồn mở

NHibernate có rất nhiều các dự án đóng góp sẵn tại http://sourceforge.net/projects/nhcontrib/

Dự án này cung cấp một số phần mở rộng rất hữu ích để NHibernate (trong số khác):

  • Providers Cache (cho bộ nhớ cache 2 cấp)
  • Dependency Injection cho các tổ chức không có constructor mặc định
  • Full-Text Tìm kiếm (tích hợp Lucene.NET)
  • Hỗ trợ không gian (tích hợp NetTopologySuite)

Hỗ trợ

EntityFramework đi kèm với sự hỗ trợ của Microsoft. NHibernate có một cộng đồng tích cực:

Ngoài ra, có một cái nhìn tại địa chỉ: http://www.infoq.com/news/2010/01/Comparing-NHibernate-EF-4

2

Thích hợp là một thuật ngữ thú vị. Nó có thể sử dụng được không? Có, và bạn sẽ tìm thấy một số tính năng tốt đẹp phù hợp với phát triển ứng dụng nhanh chóng. Điều đó nói rằng, nó là một phần của một nửa công nghệ nướng, và thiếu nhiều tính năng tiên tiến của người tiền nhiệm của nó, LINQ to SQL (thậm chí 3 năm sau khi phát hành đầu tiên của nó). Dưới đây là một vài phiền toái:

  • Poor hỗ trợ LINQ phức tạp
  • Không Enum loại tài sản
  • Thiếu SQL Chuyển đổi (phân tích DateTime, phân tích cú pháp int, vv) (mặc dù bạn có thể thực hiện những mô hình thông qua chức năng xác định)
  • Poor SQL dễ đọc
  • vấn đề giữ nhiều ssdl/csdl/nguồn MSL độc lập cho sharding (không thực sự là một vấn đề với luật đầu tiên)
  • vấn đề với việc chạy nhiều giao dịch đồng thời ở nhiều loại kh thuê ObjectContext của
  • Vấn đề với các tình huống thực thể tách rời

Điều đó nói rằng, Microsoft đã dành rất nhiều công sức vào nó, và hy vọng nó sẽ tiếp tục cải thiện theo thời gian. Cá nhân tôi sẽ dành thời gian triển khai mẫu Repository/Unit of Work được trừu tượng hóa tốt để mã của bạn không biết nó đang sử dụng EF và nếu cần, bạn có thể chuyển sang một nhà cung cấp LINQ to DB khác trong tương lai.

Hầu hết các ORM hiện đại sẽ là một bước tiến từ SQL đặc biệt.

4

NHibernate là lựa chọn tốt nhất cho bạn vì nó có hỗ trợ tốt về truy vấn phức tạp, bộ đệm ẩn cấp hai và hỗ trợ tối ưu hóa tuyệt vời. Tôi nghĩ EF đang đến đó. Nếu bạn đang đối phó với các hệ thống Legacy NHibernate là cách tiếp cận tốt nhất.

http://ayende.com/blog/4351/nhibernate-vs-entity-framework-4-0

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