ฉันจะแยกวัตถุในรหัส Entity Framework ก่อนได้อย่างไร


คำตอบ:


156

หากคุณต้องการแยกวัตถุที่มีอยู่ให้ปฏิบัติตามคำแนะนำของ @ Slauma หากคุณต้องการโหลดวัตถุโดยไม่มีการติดตามการเปลี่ยนแปลงให้ใช้:

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

ตามที่ระบุไว้ในความคิดเห็นนี้จะไม่แยกออกจากกันอย่างสมบูรณ์ พวกเขายังคงเชื่อมต่อและทำงานการโหลดขี้เกียจ แต่ไม่ได้ติดตามเอนทิตี ควรใช้ตัวอย่างนี้หากคุณต้องการโหลดเอนทิตีเท่านั้นเพื่ออ่านข้อมูลและคุณไม่ได้วางแผนที่จะแก้ไข


3
@ Ladislav: นี่อาจเป็นความหมาย coder Lol using(ctx){ return ctx....ToList(); }ฉันไม่เคยใช้และคิดเกี่ยวกับวิธีการนี้ถึงแม้ว่าฉันมักจะโหลดรายการวัตถุและทิ้งบริบทในครั้งเดียวสิ่งที่ต้องการ ในกรณีดังกล่าวการใช้AsNoTracking()จะสมเหตุสมผลมากเพราะฉันบันทึกการเติมบริบทวัตถุโดยไม่จำเป็น ฉันเดาว่ามันน่าจะมีประสิทธิภาพและการใช้หน่วยความจำโดยเฉพาะอย่างยิ่งสำหรับรายการขนาดใหญ่ใช่มั้ย
Slauma

1
@Slauma: ใช่มันมีประโยชน์ประสิทธิภาพ นั่นเป็นเหตุผลว่าทำไมวิธีนี้จึงมีอยู่จริง การใช้วิธีการนี้ใน ObjectContext API นั้นซับซ้อนกว่าเล็กน้อย
Ladislav Mrnka

2
ปิดใช้งานการโหลดที่ขี้เกียจหรือไม่
Shawn Mclean

3
ที่จริงแล้วสิ่งนี้จะไม่ปิดใช้งานการโหลดขี้เกียจมันจะปิดใช้งานการติดตามการเปลี่ยนแปลงเท่านั้นและปรับปรุงประสิทธิภาพ = เอนทิตีที่แนบมาด้วย ฉันพบว่าหลังจากตอบคำถามนี้ดังนั้นคุณควรทำเครื่องหมายที่ @ Slauma เป็นคำตอบที่ถูกต้อง
Ladislav Mrnka

1
นี่คือสิ่งที่ฉันต้องการ ฉันต้องการขี้เกียจโหลดและความสามารถในการปรับเปลี่ยนเอนทิตีที่แยกออกมาเท่านั้น
Shawn Mclean

255

นี่คือตัวเลือก:

dbContext.Entry(entity).State = EntityState.Detached;

3
ฉันสามารถทำได้เมื่อดึงวัตถุที่ส่งคืน IQueryable หรือไม่?
Shawn Mclean

1
@Lol coder: ฉันไม่แน่ใจว่าฉันเข้าใจคุณถูกต้องหรือไม่ แต่entityต้องเป็นวัตถุที่เป็นรูปธรรมซึ่งเป็นส่วนหนึ่งของคลาสรุ่นของคุณ (บุคคลลูกค้าคำสั่งซื้อ ฯลฯ ) คุณไม่สามารถผ่านเข้าไปใน IQueryable <T> dbContext.Entry(...)โดยตรง นั่นคือคำถามที่คุณหมายถึง?
Slauma

9
@EladBenda: มันขึ้นอยู่กับ Detachedหากคุณต้องการที่จะแยกวัตถุที่แนบมาแล้วกับบริบทที่ตั้งของรัฐเพื่อ หากคุณต้องการไปยังหน่วยงานในการโหลดจาก DB โดยไม่ต้องติดที่ทุกบริบท (ไม่มีการติดตามการเปลี่ยนแปลง), AsNoTrackingการใช้งาน
Slauma

1
ฉันพบปัญหาที่น่าสนใจด้วยวิธีนี้ แม้ว่ากิจการที่อาจจะเป็นระดับพร็อกซี่, Detachedโหลดขี้เกียจจะไม่ทำงานหลังจากที่คุณเปลี่ยนสถานะของมันไป
kjbartel

4
@kjbartel: นี่เป็นลักษณะการทำงานที่คาดไว้เนื่องจากเอนทิตีไม่มีการเชื่อมโยงกับบริบท
Ricardo Souza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.