Entity Framework. ลบ () เทียบกับ. RemoveObject ()


141

คุณสามารถลบรายการออกจากฐานข้อมูลโดยใช้ EF โดยใช้สองวิธีต่อไปนี้

ที่แรกก็คือบนและครั้งที่สองในนั้นEntityCollectionObjectContext

ควรใช้แต่ละครั้งเมื่อใด

เป็นที่ชื่นชอบมากกว่าคนอื่น ๆ ?

Remove()ผลตอบแทนboolและผลตอบแทนDeleteObject()void

คำตอบ:


275

โดยทั่วไปไม่ถูกต้องที่คุณสามารถ " ลบรายการออกจากฐานข้อมูล " ด้วยทั้งสองวิธี เพื่อความแม่นยำมันเป็นเช่นนั้น:

  • ObjectContext.DeleteObject(entity)ทำเครื่องหมายเอนทิตีเช่นเดียวกับDeletedในบริบท ( EntityStateเป็นDeletedหลังจากนั้น) ถ้าคุณโทรSaveChangesหลังจากนั้น EF ส่งDELETEคำสั่งSQL ไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงในฐานข้อมูลที่ถูกละเมิดเอนทิตีจะถูกลบออกมิฉะนั้นจะมีข้อผิดพลาดเกิดขึ้น

  • EntityCollection.Remove(childEntity)เครื่องหมายความสัมพันธ์ระหว่างพ่อแม่และchildEntityDeletedเป็น หากchildEntityตัวเองถูกลบออกจากฐานข้อมูลและสิ่งที่เกิดขึ้นเมื่อคุณโทรSaveChangesขึ้นอยู่กับชนิดของความสัมพันธ์ระหว่างสอง:

    • หากความสัมพันธ์เป็นตัวเลือกเช่นกุญแจต่างประเทศที่อ้างอิงจากเด็กไปยังผู้ปกครองในฐานข้อมูลอนุญาตให้มีNULLค่าต่างประเทศนี้จะถูกตั้งค่าเป็นโมฆะและถ้าคุณเรียกSaveChangesสิ่งนี้ว่าNULLค่าสำหรับchildEntityจะถูกเขียนไปยังฐานข้อมูล (เช่นความสัมพันธ์ระหว่าง ทั้งสองถูกลบออก) สิ่งนี้เกิดขึ้นกับUPDATEคำสั่งSQL ไม่มีDELETEคำสั่งเกิดขึ้น

    • ถ้าความสัมพันธ์จะต้อง (คน FK ไม่อนุญาตให้มีNULLค่า) และความสัมพันธ์จะไม่ระบุ (ซึ่งหมายความว่าที่สำคัญต่างประเทศไม่ได้เป็นส่วนหนึ่งของ (คอมโพสิต) คีย์หลักของเด็ก) คุณต้องเพิ่มเด็กไปยังผู้ปกครองอื่นหรือ คุณต้องลบเด็กอย่างชัดเจน (ด้วยDeleteObjectแล้ว) หากคุณไม่ดำเนินการใด ๆ กับข้อ จำกัด การอ้างอิงผู้ใช้จะถูกละเมิดและ EF จะส่งข้อยกเว้นเมื่อคุณโทรหาSaveChangesผู้ที่น่าอับอาย"ความสัมพันธ์ที่ไม่สามารถเปลี่ยนแปลงได้เนื่องจากข้อยกเว้นของคุณสมบัติอย่างหนึ่งอย่างใดอย่างหนึ่งหรือมากกว่านั้นเป็นโมฆะ "คล้ายคลึงกัน

    • ถ้าความสัมพันธ์ที่มีการระบุ (มันจำเป็นต้องแล้วเพราะเป็นส่วนหนึ่งของคีย์หลักใด ๆ ที่ไม่สามารถNULL) EF จะทำเครื่องหมายchildEntityเป็นDeletedเช่นกัน ถ้าคุณเรียกคำสั่งSaveChangesSQL DELETEจะถูกส่งไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงอื่น ๆ ในฐานข้อมูลองค์กรจะถูกลบออกมิฉะนั้นจะเกิดข้อยกเว้น

จริง ๆ แล้วฉันสับสนเล็กน้อยเกี่ยวกับข้อสังเกตในหน้า MSDN ที่คุณเชื่อมโยงเพราะมันบอกว่า: " ถ้าความสัมพันธ์มีข้อ จำกัด ด้าน Referential Integrity การเรียกวิธีการลบบนวัตถุที่อ้างถึงทำเครื่องหมายว่าทั้งความสัมพันธ์และวัตถุที่อ้างถึงสำหรับการลบ " สิ่งนี้ดูเหมือนว่าไม่ถูกต้องหรือผิดกับฉันเพราะทั้งสามกรณีข้างต้นมี " ข้อ จำกัด ด้านการอ้างอิงความสมบูรณ์ " แต่เฉพาะในกรณีสุดท้ายที่เด็กถูกลบในความเป็นจริง (นอกเสียจากว่าหมายถึง " วัตถุที่ต้องพึ่งพา " วัตถุที่เข้าร่วมในการระบุความสัมพันธ์ซึ่งจะเป็นคำศัพท์ที่ผิดปกติ)


2
Referential Integrity wikipedia: Referential Integrity เป็นคุณสมบัติของข้อมูลที่ทุกค่าของหนึ่งคุณลักษณะ (คอลัมน์) ของความสัมพันธ์ (ตาราง) จะต้องมีอยู่ในค่าของคุณลักษณะอื่นในความสัมพันธ์ที่แตกต่างกัน (หรือเดียวกัน) ) ดังนั้นเมื่อความสัมพันธ์เป็นตัวเลือกเราจะทำลายกฎความสมบูรณ์ของข้อมูล
Mohammadreza

3
@ Mohammadreza: หากคุณ interprete NULLเป็น "Not a value" (แทนที่จะเป็น "value NULL" ตามที่ฉันเขียนบางครั้งก็เลอะเทอะ) ดังนั้น "ความสัมพันธ์ที่เป็นตัวเลือก" นั้นไม่ได้ขัดแย้งกับคำจำกัดความของ Referential Integrity
Slauma

1
ดังนั้นรุ่น EF Core ของObjectContext.DeleteObjectคืออะไร?
Jonathan Allen

13

หากคุณต้องการใช้การลบจริง ๆ คุณต้องทำให้คีย์ต่างประเทศของคุณเป็นโมฆะ แต่คุณจะต้องจบด้วยระเบียนที่ไม่ได้ใช้งาน (ซึ่งเป็นหนึ่งในสาเหตุหลักที่คุณไม่ควรทำในตอนแรก) ดังนั้นเพียงแค่ใช้Remove()

ObjectContext.DeleteObject (เอนทิตี)ทำเครื่องหมายเอนทิตีเป็นลบในบริบท (มันคือ EntityState ถูกลบหลังจากนั้น) หากคุณโทร SaveChanges หลังจากนั้น EF จะส่งคำสั่ง SQL DELETE ไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงในฐานข้อมูลที่ถูกละเมิดเอนทิตีจะถูกลบออกมิฉะนั้นจะมีข้อผิดพลาดเกิดขึ้น

EntityCollection.Remove (childEntity)ทำเครื่องหมายความสัมพันธ์ระหว่าง parent และ childEntity เป็น Deleted หาก childEntity นั้นถูกลบออกจากฐานข้อมูลและสิ่งที่เกิดขึ้นเมื่อคุณโทร SaveChanges ขึ้นอยู่กับชนิดของความสัมพันธ์ระหว่างสอง:

สิ่งที่ควรสังเกตคือการตั้งค่า.State = EntityState.Deleted ไม่ได้เรียกการเปลี่ยนแปลงที่ตรวจพบโดยอัตโนมัติ ( เก็บถาวร )


4
ตกลงสำหรับผู้ที่ลงลงคะแนนคำตอบของฉันมีอะไรจะทำอย่างไรกับ Slauma ของ - พวกเขาจุดทั้งเอกสารเดียวกัน Mine อธิบายตัวอย่างชีวิตจริงในขณะที่ทฤษฎีของเขาเป็นส่วนหนึ่งของมัน
Matas Vaitkevicius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.