Tôi nghĩ rằng thực thể nên thực hiện bình đẳng bằng cách so sánh khóa chính như mặc định, nhưng các tài liệu nhibernate khuyến cáo sử dụng danh tính doanh nghiệp:nhibernate: thực tiễn tốt nhất để thực hiện bình đẳng là gì?
Cách rõ ràng nhất là thực hiện Equals()/GetHashCode() bằng cách so sánh giá trị định danh của cả hai đối tượng. Nếu giá trị là như nhau, cả hai phải là cùng một hàng cơ sở dữ liệu, do đó chúng bằng nhau (nếu cả hai được thêm vào một ISet, chúng ta sẽ chỉ có một phần tử trong ISet). Thật không may, chúng tôi không thể sử dụng phương pháp đó. NHibernate sẽ chỉ gán các giá trị định danh cho các đối tượng liên tục, một cá thể mới được tạo sẽ không có bất kỳ giá trị định danh nào! Chúng tôi khuyên bạn nên triển khai Equals() và GetHashCode() bằng cách sử dụng bình đẳng khóa doanh nghiệp.
kinh doanh bình đẳng chính có nghĩa là Equals() phương pháp so sánh chỉ các thuộc tính hình thành chìa khóa kinh doanh, một chìa khóa đó sẽ xác định ví dụ của chúng ta trong thế giới thực (một phím ứng cử viên tự nhiên)
Và ví dụ (cũng từ doc):
public override bool Equals(object other)
{
if (this == other) return true;
Cat cat = other as Cat;
if (cat == null) return false; // null or not a cat
if (Name != cat.Name) return false;
if (!Birthday.Equals(cat.Birthday)) return false;
return true;
}
này khiến đầu anh quay bởi vì khái niệm về bản sắc kinh doanh (theo ví dụ) cũng giống như so sánh bằng cú pháp, mà về cơ bản là loại ngữ nghĩa tôi liên kết với ValueObjects . Lý do không sử dụng các khóa cơ sở dữ liệu chính vì giá trị so sánh sẽ thay đổi mã băm của đối tượng nếu khóa chính không được tạo ở phía máy khách (cho ex incremental) và bạn sử dụng một số loại bộ sưu tập có thể bắt đầu (chẳng hạn như ISet) để lưu trữ các thực thể của bạn.
Làm cách nào tôi có thể tạo cài đặt bình đẳng tốt mà không vi phạm các quy tắc chung về bình đẳng/mã băm (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx) và tuân thủ quy tắc nhibernate?
Tại sao bạn (cụ thể) muốn/cần sử dụng Bằng? – apollodude217