Thuộc tính nghịch đảo trong NHibernate


89

Làm cách nào để sử dụng Thuộc tính nghịch đảo? Nếu tôi không nhầm, đối với một đến nhiều mối quan hệ, thuộc tính nghịch đảo phải được đặt thành true. Đối với mối quan hệ nhiều-nhiều, một trong các thuộc tính nghịch đảo của lớp thực thể phải được đặt thành true và một bộ khác thành false.

Bất cứ ai cũng có thể làm sáng tỏ điều này?


2
Bạn cũng có thể kiểm tra câu trả lời của tôi, " Khi nào sử dụng inverse =" true | false " ", cho một câu hỏi tương tự.
Daniel Schilling

Câu trả lời:


125

Thuộc tính nghịch đảo không được đặt thành true ...

Bạn sử dụng thuộc tính nghịch đảo để chỉ định 'chủ sở hữu' của liên kết. (Một liên kết có thể chỉ có một chủ sở hữu, vì vậy một đầu phải được đặt thành nghịch đảo, đầu kia phải được đặt thành 'không nghịch đảo'). (Chủ sở hữu:; inverse=falseKhông phải chủ sở hữu inverse=true:)

Trong liên kết một-nhiều, nếu bạn không đánh dấu bộ sưu tập là kết thúc nghịch đảo, thì NHibernate sẽ thực hiện CẬP NHẬT bổ sung. Trên thực tế, trong trường hợp này, NHibernate trước tiên sẽ chèn thực thể có trong bộ sưu tập, nếu cần, hãy chèn thực thể sở hữu bộ sưu tập và sau đó, cập nhật 'thực thể bộ sưu tập', để khóa ngoại được đặt và liên kết được thực hiện. (Lưu ý rằng điều này cũng có nghĩa là khóa ngoại trong DB của bạn phải có giá trị rỗng).

Khi bạn đánh dấu phần cuối của bộ sưu tập là 'nghịch đảo', thì NHibernate trước tiên sẽ giữ nguyên thực thể 'sở hữu' bộ sưu tập và sau đó sẽ giữ nguyên các thực thể có trong bộ sưu tập, tránh phát biểu CẬP NHẬT bổ sung.

Vì vậy, trong một kết hợp hai chiều, bạn luôn có một đầu nghịch đảo.


4
Điều này giải thích tất cả mọi thứ chỉ để chủ sở hữu add là một trong đó có khóa ngoại trong bảng
Brijesh Mishra

48
Theo tôi đây thực sự là một thuật ngữ không tốt. Tại sao không đánh dấu quyền sở hữu hơn là 'nghịch đảo' ?!
UpTheCreek

1
1 cho việc sử dụng phủ về một thuật ngữ đã phủ nhận :) "Thuộc tính Inverse PHẢI KHÔNG được thiết lập là true"
contactmatt

Câu trả lời tốt, câu hỏi duy nhất còn lại là làm thế nào để quyết định ai sẽ là "chủ sở hữu"
PandaWood

Điều gì về nhiều-nhiều khi bạn có một bảng giữa chứa mối quan hệ giữa 2 thực thể?
Dark_Knight,

10

Ngoài câu trả lời ở trên và theo sự hiểu biết của tôi, bạn cần duy trì giá trị khóa ngoại trong bộ sưu tập theo cách thủ công, đó là nếu bạn không muốn câu lệnh cập nhật bổ sung:

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

để được giải thích thêm về thuộc tính nghịch đảo, hãy xem bài đăng sau:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/


2

Tôi có thể thấy nơi "chủ sở hữu" đi vào, nhưng một liên kết là một đường ống và bạn có thể nhìn xuống một trong hai đầu, vì vậy, còn gì để nói thực thể nào "sở hữu" đường ống.

Một cách nhìn khác về vấn đề này là trong mối quan hệ Một - Nhiều, thực tế có 2 mối quan hệ đang diễn ra.

Mối quan hệ 1: Cha mẹ với nhiều con cái.

Mối quan hệ 2: Mỗi đứa trẻ với một phụ huynh

Vì vậy NH sẽ cố gắng chạy sql để lưu trữ từng thứ này trong DB. Nhưng không cần thiết vì khi bạn đặt Khóa ngoại, ví dụ như trong Mối quan hệ 2 khi một phần tử con được lưu trữ, thì nó tự động đã cố định mối quan hệ của cha mẹ với con vì Mối quan hệ 1 là "Nghịch đảo" của Mối quan hệ 2 .

Vì vậy, nghịch đảo có nghĩa là cái gì đó mà chúng ta nhận được theo mặc định khi chúng ta đã thiết lập mối quan hệ chính. tức là không cần NH chạy sql để sửa chữa Mối quan hệ 1 và bằng cách đánh dấu tập hợp con là một NH Nghịch đảo sẽ bỏ qua việc chạy sql khi tập hợp con được thêm vào.

Tôi giả định rằng nếu bạn không nói với NH rằng nó là một nghịch đảo, thì sẽ lãng phí nỗ lực trong việc thực hiện sql để thử và thiết lập mối quan hệ nghịch đảo - mặc dù nó không cần thiết.

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.