2009-12-16 35 views

Trả lời

213

NHibernate ngữ nghĩa:

  1. Danh sách: Đã đặt hàng bộ sưu tập của các đối tượng, trùng lặp cho phép. Sử dụng mã .NET IList. Cột chỉ mục sẽ cần phải được ánh xạ trong NHibernate.

  2. Đặt: Bộ sưu tập không theo thứ tự các thực thể duy nhất, các bản sao không được phép. Sử dụng Iesi.Collection.ISet trong mã (NH trước v4) hoặc System.Collections.Generic.ISet (NH v4 +). Điều quan trọng là ghi đè GetHashCodeEquals để chỉ định định nghĩa doanh nghiệp trùng lặp. Có thể được sắp xếp bằng cách xác định một orderby hoặc bằng cách xác định một so sánh dẫn đến một kết quả SortedSet.

  3. Túi: Danh sách các thực thể không theo thứ tự, các bản sao được phép. Sử dụng mã .NET ICollection<T>. Cột chỉ mục của danh sách không được ánh xạ và không được NHibernate vinh danh.

+16

3. ICollection có mã không? – Firo

+0

Re: # 2, chúng ta không thể sử dụng thường xuyên 'ISet' thay vì' Iesi'? –

+0

@SergeyTachenov: xem http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset để có câu trả lời có thể. Khi câu trả lời này được viết ISet không phải là một phần của .net –

1

Sự khác biệt chính là danh sách có thứ tự ngầm định cho các phần tử, được lập chỉ mục theo vị trí của chúng trong danh sách. Các bộ và túi cũng có thể được "đặt hàng" thường bằng một Bộ so sánh hoặc một đơn hàng theo mệnh đề được áp dụng khi các mục đó ra khỏi DB. Cá nhân, tôi đã không bao giờ sử dụng Túi ... nếu tôi biết dữ liệu tôi muốn được đặt hàng tuần tự tôi sử dụng Danh sách nếu không tôi sử dụng Set.

0

Đặt không cho phép bạn có các thành phần lặp lại trong đó. Nếu bạn sẽ cố gắng thêm một số phần tử mới, nó sẽ so sánh (phương thức Equals được sử dụng) mỗi phần tử đã có trong bộ sưu tập với phần bạn thêm vào, và nếu một phần tử retuns đúng, sẽ không được thêm

19

Tất cả các đối tượng này trong NHibernate là chính xác giống như các triển khai khác của các kiểu dữ liệu trừu tượng này (ADT). Tôi đã rất ngạc nhiên khi thấy Bộ và Túi trực tuyến khó khăn như thế nào vì những cái tên phổ biến cho những thứ khác, vì vậy tôi đã liệt kê một số liên kết và mô tả ở đây.

Để biết thông tin chi tiết hơn hãy xem ví dụ sau: Lists, SetsBags

Các quy tắc chung là:

Lists theo mặc định đặt hàng, sử dụng những nếu bạn muốn có thể kéo ra một đối tượng bằng chỉ mục của nó hoặc bạn có một kỳ lạ của vòng for trên foreach vòng lặp. Bạn không cần phải truy cập chúng theo thứ tự như bạn sẽ cần đến trong một Linked List. ADT này cho phép trùng lặp.

Xin lưu ý! Mặc dù danh sách được sắp xếp như BryanD được đề cập trong câu trả lời của mình, hoàn toàn không có gì nói rằng nó phải theo thứ tự bạn mong đợi từ cơ sở dữ liệu khi bạn thực hiện truy vấn HQL trừ khi bạn chỉ định thứ tự theo lệnh. Đó là bởi vì điều này mà một số người thích sử dụng Set hoặc Túi thay vào đó, để nó không cung cấp cho các ảo tưởng được lệnh. Mặc dù tôi nói điều này, hầu hết thời gian họ sẽ xuất hiện để được theo thứ tự hiển thị, vì chúng được thêm vào danh sách theo thứ tự mà chúng được tìm thấy trong truy vấn NHibernate chạy.

Đặtkhông theo mặc định, bạn không thể truy cập bất kỳ biến nào trực tiếp thông qua chỉ mục. Các bộ theo mặc định là chỉ ADT trong số ba trường hợp trên duy trì tính duy nhất của đối tượng. Đây là những điều tuyệt vời nếu bạn có một bộ sưu tập nếu bạn yêu cầu không chứa các bản sao.

Túi (hoặc Multisets), như bạn có thể nhìn thấy từ các liên kết trên, một loại Set mà không cho phép các đối tượng bên trong nó là bản sao của đối tượng khác. Đây không phải là thường được sử dụng, như đặt hàng danh sách có thể được bỏ qua, và do đó được coi là một túi.

Liên quan đến cách chúng được sử dụng trong NHibernate, không có gì được lấy từ cơ sở dữ liệu khác nhau tùy thuộc vào ADT bạn chọn ở đây, đó là những gì bạn muốn sử dụng nó để làm cho bạn chọn ADT khác nhau.

Cá nhân, tôi sử dụng Bộ cho hầu hết mọi thứ vì tôi thường yêu cầu các đối tượng con là duy nhất và thứ tự không phải là vấn đề.Mặc dù tôi sẽ sử dụng Danh sách nơi tôi có một nhóm đối tượng mà tôi muốn đặt hàng bởi một cái gì đó, ví dụ thời gian, để đạt được thứ tự này, tôi cần phải tự đặt "thứ tự theo" trong truy vấn HQL.

+2

Sửa trên danh sách - sử dụng danh sách trong tệp ánh xạ NHibernate SILL yêu cầu ánh xạ cột chỉ mục. Bằng cách này danh sách sẽ được rút ra theo thứ tự chính xác mà nó được đưa vào. –

+0

@Michael Gattuso Điểm tốt, tôi nên đề cập trong câu trả lời ở trên là tôi đã nói về các truy vấn HQL (do đó là 'thứ tự theo' bình luận) thay vì đặc tả bộ sưu tập thực tế trong tệp ánh xạ của bạn. – Jay

+0

Một lợi ích của việc sử dụng túi là chúng không phải được nạp từ cơ sở dữ liệu khi bạn thêm các phần tử mới vào nó. Không có bản sao để kiểm tra, không có thứ tự để xác định. – tvaananen

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