2009-04-03 42 views
82

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 trong nhiều mối quan hệ thì thuộc tính nghịch đảo phải được đặt thành true. Đối với các 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 thuộc tính khác được đặt thành false.Thuộc tính nghịch đảo trong NHibernate

Mọi người đều 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 sử dụng inverse =" true | false "] (http://stackoverflow.com/a/6951546/221708)", trên một câu hỏi tương tự. –

Trả lời

114

Thuộc tính nghịch đảo phải không được thiết lập là true ...

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

Kết hợp một-nhiều, nếu bạn không đánh dấu bộ sưu tập là kết thúc ngược, thì NHibernate sẽ thực hiện thêm UPDATE. Thực tế, trong trường hợp này, NHibernate trước tiên sẽ chèn thực thể được chứa trong bộ sưu tập, nếu cần chèn thực thể sở hữu bộ sưu tập, và sau đó, cập nhật 'thực thể thu', để 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 vô hiệu).

Khi bạn đánh dấu kết thúc bộ sưu tập là 'nghịch đảo', thì NHibernate đầu tiên sẽ tiếp tục thực thể 'sở hữu' bộ sưu tập và sẽ tiếp tục tồn tại các thực thể trong bộ sưu tập sau đó, tránh câu lệnh UPDATE bổ sung.

Vì vậy, trong một hiệp hội hai hướng, bạn luôn có một kết thúc ngược.

+4

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

+3

http://tadtech.blogspot.com/2007/02/hibernate-when-is-inversetrue-and-when.html –

+42

Theo ý kiến ​​của tôi, đây là thuật ngữ thực sự xấu. Tại sao không đánh dấu quyền sở hữu thay vì 'nghịch đảo' ?! – UpTheCreek

8

Ngoài the answer above, và theo hiểu biết của tôi, bạn cần phải kiên trì giá trị khóa ngoại trong bộ sưu tập bằng tay, có nghĩa là nếu bạn không muốn thêm các báo cáo cập nhật:

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); 

để biết thêm giải thích các thuộc tính nghịch đảo, kiểm tra các bài sau:

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

2

tôi có thể nhìn thấy nơi các "chủ sở hữu" đến, nhưng một hiệp hội là một đường ống, và bạn có thể nhìn xuống hai đầu, để whats Sa y mà thực thể "sở hữu" đường ống.

Một cách khác để xem xét điều này là trong mối quan hệ Một đến 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 trẻ em.

Mối quan hệ 2: Mỗi trẻ em đối với cha mẹ

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 phải vì khi bạn đặt Khóa ngoại, ví dụ: trong Mối quan hệ 2 khi một đứa trẻ được lưu trữ, sau đó nó sẽ tự động cố định mối quan hệ của cha mẹ với đứa trẻ cũng bởi 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 mặc định khi chúng tôi đã 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 bộ sưu tập trẻ em là Inverse NH sẽ bỏ qua chạy sql khi bộ sưu tập trẻ em được thêm vào.

Tôi giả định rằng nếu bạn không nói với NH đó là một nghịch đảo, thì sẽ lãng phí công sức khi 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.

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