Saya memiliki debat mental dengan diri saya sendiri setiap kali saya mulai mengerjakan proyek baru dan saya merancang POCO saya. Saya telah melihat banyak tutorial / contoh kode yang tampaknya mendukung asosiasi kunci asing :
Asosiasi kunci asing
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Berbeda dengan asosiasi independen :
Asosiasi independen
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Saya telah bekerja dengan NHibernate di masa lalu, dan menggunakan asosiasi independen, yang tidak hanya terasa lebih OO, tetapi juga (dengan pemuatan lambat) memiliki keuntungan untuk memberi saya akses ke seluruh objek Pelanggan, bukan hanya ID-nya. Ini memungkinkan saya, misalnya, mengambil instance Order dan kemudian melakukannya Order.Customer.FirstName
tanpa harus melakukan penggabungan secara eksplisit, yang sangat memudahkan.
Jadi untuk rekap, pertanyaan saya adalah:
- Apakah ada kerugian yang signifikan dalam menggunakan asosiasi independen? dan...
- Jika tidak ada, apa alasan untuk menggunakan asosiasi kunci asing?
sumber
Gunakan keduanya. Dan buat referensi entitas Anda menjadi virtual untuk memungkinkan pemuatan lambat. Seperti ini:
Ini menghemat pencarian DB yang tidak perlu, memungkinkan pemuatan lambat, dan memungkinkan Anda untuk dengan mudah melihat / mengatur ID jika Anda tahu apa yang Anda inginkan. Perhatikan bahwa memiliki keduanya tidak mengubah struktur tabel Anda dengan cara apa pun.
sumber
Asosiasi independen tidak bekerja dengan baik
AddOrUpdate
yang biasanya digunakan dalamSeed
metode. Ketika referensi adalah item yang sudah ada, itu akan dimasukkan kembali.Hasilnya pelanggan lama akan dimasukkan kembali dan pelanggan baru (dimasukkan kembali) akan dikaitkan dengan pesanan baru.
Kecuali kita menggunakan asosiasi kunci asing dan menetapkan id.
Kami memiliki perilaku yang diharapkan, pelanggan yang ada akan dikaitkan dengan pesanan baru.
sumber
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
Atau Anda dapat menggunakan metode Pilih untuk memuat pelanggan dari konteks db. Ini bekerja dengan asosiasi independen.Saya menyukai pendekatan objek untuk menghindari pencarian yang tidak perlu. Objek properti bisa dengan mudah diisi saat Anda memanggil metode pabrik untuk membangun seluruh entitas (menggunakan kode panggilan balik sederhana untuk entitas bertingkat). Tidak ada kerugian yang bisa saya lihat kecuali untuk penggunaan memori (tetapi Anda akan men-cache objek Anda, kan?). Jadi, semua yang Anda lakukan adalah mengganti tumpukan untuk heap dan mendapatkan keuntungan kinerja dari tidak melakukan pencarian. Saya harap ini masuk akal.
sumber