Atribut Terbalik di NHibernate

89

Bagaimana cara menggunakan Atribut Invers? Jika saya tidak salah, untuk satu ke banyak hubungan atribut invers harus disetel ke true. Untuk hubungan banyak-ke-banyak, salah satu atribut invers kelas entitas harus disetel ke benar dan yang lainnya disetel ke salah.

Adakah yang bisa menjelaskan hal ini?

Graviton
sumber
2
Anda juga dapat memeriksa jawaban saya, " When to use inverse =" true | false " ", pada pertanyaan serupa.
Daniel Schilling

Jawaban:

126

Atribut terbalik tidak boleh disetel ke benar ...

Anda menggunakan atribut invers untuk menentukan 'pemilik' dari asosiasi. (Sebuah asosiasi hanya dapat memiliki satu pemilik, jadi salah satu ujung harus disetel ke terbalik, ujung lainnya harus disetel ke 'non invers'). (Pemilik: inverse=false; Non-pemilik: inverse=true)

Dalam pengaitan satu-ke-banyak, jika Anda tidak menandai koleksi sebagai ujung terbalik, maka NHibernate akan melakukan UPDATE tambahan. Faktanya, dalam hal ini, NHibernate pertama-tama akan memasukkan entitas yang terdapat dalam koleksi, jika perlu memasukkan entitas yang memiliki koleksi, dan kemudian memperbarui 'entitas koleksi', sehingga kunci asing ditetapkan dan pengaitan terbuat. (Perhatikan bahwa ini juga berarti bahwa foreign key di DB Anda harus nullable).

Saat Anda menandai akhir koleksi sebagai 'invers', maka NHibernate pertama-tama akan mempertahankan entitas yang 'memiliki' koleksi tersebut, dan akan mempertahankan entitas yang ada dalam koleksi setelahnya, menghindari pernyataan UPDATE tambahan.

Jadi, dalam asosiasi dua arah, Anda selalu memiliki satu ujung terbalik.

Frederik Gheysels
sumber
4
Ini menjelaskan semuanya hanya untuk menambahkan pemilik adalah yang memiliki kunci asing di tabel
Brijesh Mishra
48
Menurut saya istilah ini sangat buruk. Mengapa tidak menandai kepemilikan daripada 'terbalik' ?!
UpTheCreek
1
+1 untuk menggunakan negasi pada istilah yang sudah dinegasikan :) "Atribut INVERSE HARUS TIDAK disetel ke true"
contactmatt
Jawaban yang bagus, satu-satunya pertanyaan yang tersisa adalah bagaimana memutuskan siapa yang harus menjadi "pemilik"
PandaWood
Bagaimana dengan many-to-many jika Anda memiliki tabel tengah yang berisi relasi antara 2 entitas?
Dark_Knight
10

Selain jawaban di atas , dan menurut pemahaman saya, Anda perlu mempertahankan nilai kunci asing dalam koleksi secara manual, yaitu jika Anda tidak menginginkan pernyataan pembaruan tambahan:

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

untuk penjelasan lebih lanjut tentang atribut inverse, cek postingan berikut ini:

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

Emad Alashi
sumber
2

Saya dapat melihat di mana "pemilik" masuk, tetapi asosiasi adalah pipa, dan Anda dapat melihat kedua ujungnya, jadi apa yang harus dikatakan entitas mana yang "memiliki" pipa.

Cara lain untuk melihat ini adalah, bahwa dalam hubungan Satu ke Banyak, sebenarnya ada 2 hubungan yang terjadi.

Hubungan 1: Orangtua dengan Banyak Anak.

Hubungan 2: Setiap Anak dengan Orang Tua

Jadi NH akan mencoba menjalankan sql untuk menyimpan masing-masing ini di DB. Tetapi tidak perlu karena ketika Anda mengatur Kunci Asing misalnya di Relasi 2 ketika seorang anak disimpan, maka secara otomatis telah memperbaiki hubungan orang tua dengan anak itu juga karena Relasi 1 adalah "Invers" dari Relasi 2 .

Jadi inverse artinya, ini adalah sesuatu yang kita dapatkan secara default setelah kita mengatur hubungan utama. yaitu tidak perlu NH menjalankan sql untuk memperbaiki Hubungan 1 dan dengan menandai koleksi anak sebagai Inverse NH akan melewatkan running sql ketika koleksi anak ditambahkan ke.

Saya berasumsi bahwa jika Anda tidak memberi tahu NH itu kebalikannya, maka akan sia-sia upaya dalam melakukan sql untuk mencoba dan mengatur hubungan terbalik juga - meskipun itu tidak perlu.

Mickey Puri
sumber