Dalam logika bisnis kami, kami terkadang menetapkan metode seperti ini:
User.ResetCourse(Course courseToReset)
Masalahnya adalah bahwa Pengguna dan Kursus adalah objek proxy Entity Framework. Ini berarti bahwa ketika kita menekan properti navigasi pada Pengguna atau Kursus itu dapat menyebabkan hit besar ke database karena objek-objek tersebut tidak dapat IQuery sehingga beralih melalui mereka secara normal.
Untuk mengatasi ini kami mengubah tanda tangan menjadi:
User.ResetCourse(MyDBContext db, Course courseToReset)
Ini berarti kita dapat secara langsung meminta basis data untuk membuat perubahan yang kita butuhkan secara efisien tetapi meneruskan konteks Database ke objek bisnis sepertinya sangat salah.
Kami kemudian bermigrasi ke pengguna lapisan layanan yang berarti kami memiliki sesuatu seperti:
CourseService.ResetForUser(Course courseToReset, User forUser)
Layanan ini memiliki referensi ke DBContext yang disuntikkan pada penciptaan tetapi sekarang objek bisnis kami hanya tas data tanpa perilaku (yaitu Model Domain Anemik).
Bagaimana kita bisa menghindari ini?
Jawaban:
Masalahnya adalah, Anda menggunakan objek EF sebagai objek domain sejak awal. Objek EF adalah model data BUKAN model bisnis.
Anda perlu mendeklarasikan objek bisnis yang memberi Anda kebebasan untuk melakukan apa yang Anda butuhkan, dan kemudian mengambil dan menyimpannya dengan repositori. Repositori Anda akan memetakan entitas EF ke entitas bisnis Anda. Objek EF tidak boleh digunakan di luar repositori Anda.
sumber
Anda mungkin dapat menghindarinya dengan melakukan sesuatu seperti:
Atau sesuatu untuk efek itu, jika Anda mengetahui maksud saya. Kedengarannya seperti pendekatan yang Anda miliki dengan cara awal yang Anda gambarkan terkait kinerja , dan belum tentu terkait dengan struktur domain. Jadi sebenarnya Anda harus mempertimbangkan untuk memecahkan masalah kinerja di lapisan layanan tetapi dapat menjaga perilaku di domain. Akan sangat membantu untuk mengetahui apa artinya mengatur ulang Pengguna / Kursus dalam konteks ini juga jika Anda menginginkan jawaban yang lebih baik.
sumber
Secara tradisional, ini diselesaikan dengan menggunakan strategi pengambilan untuk setiap kasus penggunaan yang menginstruksikan Kerangka Entitas untuk segera memuat asosiasi yang diperlukan pada permintaan awal menggunakan IQueryable.Include ().
Udi Dahan menulis posting yang menggambarkan pendekatan umum, yang dapat disesuaikan dengan Kerangka Entitas.
http://udidahan.com/2007/09/16/fetching-strategy-nhibernate-implementation-available/
sumber