NHibernate'de Ters Öznitelik


89

Ters Özniteliği nasıl kullanırım? Eğer yanılmıyorsam, birden çok ilişkide ters niteliğin doğru olarak ayarlanması gerekir. Çoktan çoğa ilişkiler için, varlık sınıfının ters özniteliklerinden biri doğru, diğeri yanlış olarak ayarlanmalıdır.

Kimse buna biraz ışık tutabilir mi?


2
Ayrıca benzer bir soru için " inverse =" true | false "ne zaman kullanılmalı" yanıtımı da kontrol edebilirsiniz .
Daniel Schilling

Yanıtlar:


126

Ters özniteliği true olarak ayarlanmamalıdır ...

İlişkilendirmenin "sahibini" belirtmek için ters özniteliği kullanırsınız. (Bir ilişkilendirmenin yalnızca bir sahibi olabilir, bu nedenle bir ucun ters, diğer ucunun 'ters olmayan' olarak ayarlanması gerekir). (Sahibi: inverse=false; Dışı sahibi: inverse=true)

Bire çok ilişkilendirmede, koleksiyonu ters uç olarak işaretlemezseniz, NHibernate ek bir GÜNCELLEME gerçekleştirir. Aslında, bu durumda, NHibernate önce koleksiyonda bulunan varlığı ekler, gerekirse koleksiyona sahip olan varlığı ekler ve daha sonra 'toplama varlığını' günceller, böylece yabancı anahtar ayarlanır ve ilişkilendirilir yapılmış. (Bunun ayrıca DB'nizdeki yabancı anahtarın null yapılabilir olması gerektiği anlamına geldiğini unutmayın).

Koleksiyonun sonunu 'ters' olarak işaretlediğinizde, NHibernate önce koleksiyonun 'sahibi' olan varlığı sürdürecek ve daha sonra koleksiyondaki varlıkları koruyarak ek bir UPDATE ifadesinden kaçınacaktır.

Yani, iki yönlü bir ilişkide, her zaman bir ters ucunuz vardır.


4
Bu, sadece sahibi eklemek için her şeyi açıklar, masada yabancı anahtar olan bir tanesidir
Brijesh Mishra

48
Bence bu gerçekten kötü bir terminoloji. Neden 'tersi' yerine mülkiyeti işaretlemiyorsunuz ?!
UpTheCreek

1
Zaten olumsuzlanmış bir terimde olumsuzlamayı kullanmak için +1 :) "INVERSE özniteliği doğru olarak ayarlanmamalıdır"
contactmatt

İyi cevap, geriye kalan tek soru kimin "sahip" olacağına nasıl karar verileceği
PandaWood

2 varlık arasındaki ilişkiyi tutan bir orta masanız olduğunda çoktan çoğa ne olacak?
Dark_Knight

10

Yukarıdaki cevaba ek olarak ve benim anlayışıma göre, koleksiyondaki yabancı anahtar değerini manuel olarak sürdürmeniz gerekir, yani ekstra güncelleme ifadesini istemiyorsanız:

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

ters özniteliğin daha fazla açıklaması için aşağıdaki gönderiye bakın:

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


2

"Sahibin" nereden geldiğini görebiliyorum, ancak bir ilişki bir borudur ve her iki uca da aşağı bakabilirsiniz, yani borunun "sahibi" olan varlığın ne olduğunu söyleyebilirsiniz.

Buna farklı bir bakış açısı, Bire Çoğa ilişkilerde aslında 2 ilişki sürmekte olmasıdır.

İlişki 1: Birçok Çocuğa Ebeveyn.

İlişki 2: Her Çocuktan Ebeveyne

Dolayısıyla NH, bunların her birini DB'de depolamak için sql çalıştırmaya çalışacaktır. Ancak buna gerek yoktur, çünkü örneğin İlişki 2'de bir çocuk depolandığında Yabancı Anahtarı ayarladığınızda, o zaman bir ebeveynin çocukla olan ilişkisini de otomatik olarak düzeltir çünkü İlişki 1, İlişki 2'nin "Tersi" dir. .

Yani ters, ana ilişkiyi kurduğumuzda varsayılan olarak aldığımız bir şey anlamına gelir. Yani NH'nin, İlişki 1'i düzeltmek için sql çalıştırmasına gerek yoktur ve çocuk koleksiyonunu Ters NH olarak işaretleyerek, çocuk koleksiyonu eklendiğinde çalışan sql'yi atlayacaktır.

Eğer NH'ye bunun ters olduğunu söylemediyseniz, ters ilişkiyi denemek ve kurmak için sql yapmak için çaba harcayacağını varsayıyorum - buna gerek olmasa bile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.