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?
nhibernate
nhibernate-mapping
Graviton
sumber
sumber
Jawaban:
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.
sumber
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/
sumber
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.
sumber