Saya mengerti frustrasi OPs, penggunaan virtual ini bukan untuk abstraksi templated bahwa defacto virtual modifier efektif untuk.
Jika ada yang masih berjuang dengan ini, saya akan menawarkan sudut pandang saya, karena saya mencoba untuk menjaga solusi sederhana dan jargon seminimal mungkin:
Entity Framework dalam sebuah karya sederhana memang memanfaatkan lazy loading, yang setara dengan menyiapkan sesuatu untuk eksekusi di masa mendatang. Itu cocok dengan pengubah 'virtual', tetapi ada lebih dari ini.
Di Entity Framework, menggunakan properti navigasi virtual memungkinkan Anda untuk menunjukkannya sebagai setara dengan kunci asing nullable di SQL. Anda tidak HARUS bergabung dengan setiap tabel yang dikunci saat melakukan kueri, tetapi ketika Anda membutuhkan informasi - itu menjadi didorong oleh permintaan.
Saya juga menyebutkan nullable karena banyak properti navigasi tidak relevan pada awalnya. yaitu dalam skenario pelanggan / pesanan, Anda tidak harus menunggu sampai saat pesanan diproses untuk membuat pelanggan. Anda bisa, tetapi jika Anda memiliki proses multi-tahap untuk mencapai ini, Anda mungkin merasa perlu untuk bertahan data pelanggan untuk penyelesaian kemudian atau untuk penyebaran untuk pesanan masa depan. Jika semua properti nav diimplementasikan, Anda harus menetapkan setiap kunci asing dan bidang relasional di save. Itu benar-benar hanya mengatur data kembali ke memori, yang mengalahkan peran kegigihan.
Jadi sementara itu mungkin tampak samar dalam eksekusi aktual pada saat run time, saya telah menemukan aturan praktis terbaik untuk digunakan adalah: jika Anda mengeluarkan data (membaca Model Tampilan atau Model Serializable) dan membutuhkan nilai sebelum referensi, jangan gunakan virtual; Jika ruang lingkup Anda mengumpulkan data yang mungkin tidak lengkap atau kebutuhan untuk mencari dan tidak mengharuskan setiap parameter pencarian selesai untuk pencarian, kode akan menggunakan referensi dengan baik, mirip dengan menggunakan properti nilai nullable int? panjang?. Juga, mengabstraksi logika bisnis Anda dari pengumpulan data Anda hingga kebutuhan untuk menyuntikkannya memiliki banyak manfaat kinerja, mirip dengan membuat instance objek dan memulainya dengan nol. Entity Framework menggunakan banyak refleksi dan dinamika, yang dapat menurunkan kinerja, dan kebutuhan untuk memiliki model yang fleksibel yang dapat disesuaikan dengan kebutuhan sangat penting untuk mengelola kinerja.
Bagi saya, itu selalu lebih masuk akal daripada menggunakan jargon teknologi kelebihan seperti proxy, delegasi, penangan dan semacamnya. Setelah Anda menekan lang pemrograman ketiga atau keempat Anda, itu bisa berantakan dengan ini.