Bagaimana cara melepaskan objek dalam Kode Kerangka Entitas Pertama?

Jawaban:

156

Jika Anda ingin melepaskan objek yang ada, ikuti saran @ Slauma. Jika Anda ingin memuat objek tanpa melacak perubahan, gunakan:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Seperti disebutkan dalam komentar, ini tidak akan sepenuhnya melepaskan entitas. Mereka masih terikat dan malas memuat karya tetapi entitas tidak dilacak. Ini harus digunakan misalnya jika Anda ingin memuat entitas hanya untuk membaca data dan Anda tidak berencana untuk memodifikasinya.

Ladislav Mrnka
sumber
3
@Ladislav: Ini memang mungkin yang dimaksud Lol coder. Saya tidak pernah menggunakan dan memikirkan metode ini walaupun saya sering memuat daftar objek dan membuang konteksnya sekaligus, kira-kira seperti itu using(ctx){ return ctx....ToList(); }. Dalam kasus seperti itu menggunakan AsNoTracking()akan masuk akal karena saya akan menghemat mengisi konteks objek yang tidak perlu. Saya kira itu mungkin akan memiliki manfaat konsumsi kinerja dan memori terutama untuk daftar besar, kan?
Slauma
1
@Slauma: Ya, itu memiliki manfaat kinerja. Itulah sebabnya mengapa metode ini ada. Menggunakan pendekatan ini di ObjectContext API sedikit lebih rumit.
Ladislav Mrnka
2
Apakah ini menonaktifkan pemuatan malas?
Shawn Mclean
3
Sebenarnya ini tidak akan menonaktifkan pemuatan malas, itu hanya akan menonaktifkan pelacakan perubahan dan meningkatkan kinerja = entitas masih terpasang. Saya menemukannya setelah menjawab pertanyaan ini sehingga Anda harus menandai @ Slauma sebagai jawaban yang valid.
Ladislav Mrnka
1
Ini yang aku inginkan. Saya ingin pemuatan malas dan kemampuan untuk hanya memodifikasi entitas yang terpisah.
Shawn Mclean
255

Ini sebuah opsi:

dbContext.Entry(entity).State = EntityState.Detached;
Slauma
sumber
3
Bisakah saya melakukan ini ketika mengambil objek yang mengembalikan IQueryable?
Shawn Mclean
1
@Lol coder: Saya tidak yakin apakah saya mengerti Anda benar, tetapi entityharus menjadi objek tipe yang terwujud yang merupakan bagian dari kelas model Anda (Orang, Pelanggan, Pesanan, dll.). Anda tidak dapat secara langsung meneruskan <T> IQueryable ke dbContext.Entry(...). Apakah itu pertanyaan yang Anda maksudkan?
Slauma
9
@EladBenda: Tergantung. Jika Anda ingin melepaskan objek yang sudah terlampir ke konteks, atur status ke Detached. Jika Anda ingin memuat entitas dari DB tanpa melampirkannya sama sekali ke konteks (tidak ada pelacakan perubahan), gunakan AsNoTracking.
Slauma
1
Saya menemukan masalah yang menarik dengan metode ini. Meskipun entitas mungkin kelas proxy, pemuatan malas tidak akan berfungsi setelah Anda mengubah statusnya menjadi Detached.
kjbartel
4
@ kjbartel: ini adalah perilaku yang diharapkan, karena entitas tidak memiliki tautan dengan konteks.
Ricardo Souza