Câu trả lời:
Ngữ nghĩa NHibernate:
Danh sách: Tập hợp các thực thể có thứ tự, được phép trùng lặp. Sử dụng .NET IList
trong mã. Cột chỉ mục sẽ cần được ánh xạ trong NHibernate.
Tập hợp: Tập hợp các thực thể duy nhất không theo thứ tự, không được phép trùng lặ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à phải ghi đè GetHashCode
và Equals
chỉ ra định nghĩa kinh doanh của trùng lặp. Có thể được sắp xếp bằng cách xác định một thứ tự hoặc bằng cách xác định một trình so sánh dẫn đến một SortedSet
kết quả.
Túi: Danh sách thực thể không theo thứ tự, được phép trùng lặp. Sử dụng .NET ICollection<T>
trong mã. Cột chỉ mục của danh sách không được ánh xạ và không được NHibernate tôn vinh.
Tất cả các đối tượng này trong NHibernate hoàn toàn giống với các cách triển khai khác của các Kiểu dữ liệu trừu tượng (ADT) này. Tôi đã rất ngạc nhiên về việc tìm Bộ và Túi trực tuyến khó như thế nào vì các tên gọi khác thường gặp như thế nào, vì vậy tôi đã liệt kê một số liên kết và mô tả ở đây.
Để biết thêm thông tin chi tiết, hãy xem phần sau: Danh sách , Bộ và Túi
Các quy tắc chung là:
Các danh sách được sắp xếp theo thứ tự mặc định, hãy sử dụng các danh sách này nếu bạn muốn có thể lấy ra một đối tượng theo chỉ mục của nó hoặc bạn có sở thích kỳ lạ với for
các vòng lặp qua foreach
các vòng lặp. Bạn không bắt buộc phải truy cập chúng theo thứ tự như bạn cần trong Danh sách liên kết . ADT này cho phép trùng lặp.
Xin lưu ý! Mặc dù các danh sách được sắp xếp theo thứ tự như BryanD đã đề cập trong câu trả lời của mình, nhưng 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ự bằng lệnh. Đó là vì điều này mà một số người thích sử dụng Set hoặc Túi thay thế, để nó không tạo ra ảo giác như được đặt hàng. Mặc dù tôi nói điều này, hầu hết thời gian chúng sẽ xuất hiện theo thứ tự hiển thị, vì chúng được thêm vào danh sách theo thứ tự được tìm thấy trong truy vấn NHibernate chạy.
Bộ là không theo mặc định đặt hàng, bạn không thể truy cập vào bất kỳ biến trực tiếp thông qua một chỉ mục. Các bộ theo mặc định là ADT duy nhất trong số ba bộ ở trên duy trì tính duy nhất của các đối tượng của nó . Đâ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 Bộ nhiều ), như bạn có thể thấy từ các liên kết ở trên, một loại Bộ cho phép các đối tượng bên trong nó là bản sao của các đối tượng khác. Chúng thường không được sử dụng, vì thứ tự Danh sách có thể bị bỏ qua và do đó được coi như 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 một cách khác nhau tùy thuộc vào ADT bạn chọn ở đây, chính những gì bạn muốn sử dụng nó sẽ khiến 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 phải là duy nhất và thứ tự không phải là một vấn đề. Mặc dù tôi sẽ sử dụng Danh sách trong đó tôi có một nhóm các đối tượng mà tôi muốn sắp xếp theo thứ tự, chẳng hạn như thời gian, để đạt được thứ tự này, tôi cần đặt thủ công "thứ tự theo" trong truy vấn HQL.
Chà, sự khác biệt cơ bản là danh sách có thứ tự ngầm định đối với các phần tử, được lập chỉ mục theo vị trí của chúng trong danh sách. Bộ và túi cũng có thể được "đặt hàng" thường bởi Bộ so sánh hoặc đặt hàng theo mệnh đề được áp dụng khi các mặt hàng đó ra khỏi DB. Cá nhân tôi, tôi chưa bao giờ sử dụng Túi ... nếu tôi biết dữ liệu tôi muốn được sắp xếp theo thứ tự, tôi sử dụng Danh sách, nếu không tôi sử dụng Đặt.
ISet
thay vìIesi
?