คุณสามารถลบรายการออกจากฐานข้อมูลโดยใช้ EF โดยใช้สองวิธีต่อไปนี้
ที่แรกก็คือบนและครั้งที่สองในนั้นEntityCollection
ObjectContext
ควรใช้แต่ละครั้งเมื่อใด
เป็นที่ชื่นชอบมากกว่าคนอื่น ๆ ?
Remove()
ผลตอบแทนbool
และผลตอบแทนDeleteObject()
void
คุณสามารถลบรายการออกจากฐานข้อมูลโดยใช้ EF โดยใช้สองวิธีต่อไปนี้
ที่แรกก็คือบนและครั้งที่สองในนั้นEntityCollection
ObjectContext
ควรใช้แต่ละครั้งเมื่อใด
เป็นที่ชื่นชอบมากกว่าคนอื่น ๆ ?
Remove()
ผลตอบแทนbool
และผลตอบแทนDeleteObject()
void
คำตอบ:
โดยทั่วไปไม่ถูกต้องที่คุณสามารถ " ลบรายการออกจากฐานข้อมูล " ด้วยทั้งสองวิธี เพื่อความแม่นยำมันเป็นเช่นนั้น:
ObjectContext.DeleteObject(entity)
ทำเครื่องหมายเอนทิตีเช่นเดียวกับDeleted
ในบริบท ( EntityState
เป็นDeleted
หลังจากนั้น) ถ้าคุณโทรSaveChanges
หลังจากนั้น EF ส่งDELETE
คำสั่งSQL ไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงในฐานข้อมูลที่ถูกละเมิดเอนทิตีจะถูกลบออกมิฉะนั้นจะมีข้อผิดพลาดเกิดขึ้น
EntityCollection.Remove(childEntity)
เครื่องหมายความสัมพันธ์ระหว่างพ่อแม่และchildEntity
Deleted
เป็น หากchildEntity
ตัวเองถูกลบออกจากฐานข้อมูลและสิ่งที่เกิดขึ้นเมื่อคุณโทรSaveChanges
ขึ้นอยู่กับชนิดของความสัมพันธ์ระหว่างสอง:
หากความสัมพันธ์เป็นตัวเลือกเช่นกุญแจต่างประเทศที่อ้างอิงจากเด็กไปยังผู้ปกครองในฐานข้อมูลอนุญาตให้มีNULL
ค่าต่างประเทศนี้จะถูกตั้งค่าเป็นโมฆะและถ้าคุณเรียกSaveChanges
สิ่งนี้ว่าNULL
ค่าสำหรับchildEntity
จะถูกเขียนไปยังฐานข้อมูล (เช่นความสัมพันธ์ระหว่าง ทั้งสองถูกลบออก) สิ่งนี้เกิดขึ้นกับUPDATE
คำสั่งSQL ไม่มีDELETE
คำสั่งเกิดขึ้น
ถ้าความสัมพันธ์จะต้อง (คน FK ไม่อนุญาตให้มีNULL
ค่า) และความสัมพันธ์จะไม่ระบุ (ซึ่งหมายความว่าที่สำคัญต่างประเทศไม่ได้เป็นส่วนหนึ่งของ (คอมโพสิต) คีย์หลักของเด็ก) คุณต้องเพิ่มเด็กไปยังผู้ปกครองอื่นหรือ คุณต้องลบเด็กอย่างชัดเจน (ด้วยDeleteObject
แล้ว) หากคุณไม่ดำเนินการใด ๆ กับข้อ จำกัด การอ้างอิงผู้ใช้จะถูกละเมิดและ EF จะส่งข้อยกเว้นเมื่อคุณโทรหาSaveChanges
ผู้ที่น่าอับอาย"ความสัมพันธ์ที่ไม่สามารถเปลี่ยนแปลงได้เนื่องจากข้อยกเว้นของคุณสมบัติอย่างหนึ่งอย่างใดอย่างหนึ่งหรือมากกว่านั้นเป็นโมฆะ "คล้ายคลึงกัน
ถ้าความสัมพันธ์ที่มีการระบุ (มันจำเป็นต้องแล้วเพราะเป็นส่วนหนึ่งของคีย์หลักใด ๆ ที่ไม่สามารถNULL
) EF จะทำเครื่องหมายchildEntity
เป็นDeleted
เช่นกัน ถ้าคุณเรียกคำสั่งSaveChanges
SQL DELETE
จะถูกส่งไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงอื่น ๆ ในฐานข้อมูลองค์กรจะถูกลบออกมิฉะนั้นจะเกิดข้อยกเว้น
จริง ๆ แล้วฉันสับสนเล็กน้อยเกี่ยวกับข้อสังเกตในหน้า MSDN ที่คุณเชื่อมโยงเพราะมันบอกว่า: " ถ้าความสัมพันธ์มีข้อ จำกัด ด้าน Referential Integrity การเรียกวิธีการลบบนวัตถุที่อ้างถึงทำเครื่องหมายว่าทั้งความสัมพันธ์และวัตถุที่อ้างถึงสำหรับการลบ " สิ่งนี้ดูเหมือนว่าไม่ถูกต้องหรือผิดกับฉันเพราะทั้งสามกรณีข้างต้นมี " ข้อ จำกัด ด้านการอ้างอิงความสมบูรณ์ " แต่เฉพาะในกรณีสุดท้ายที่เด็กถูกลบในความเป็นจริง (นอกเสียจากว่าหมายถึง " วัตถุที่ต้องพึ่งพา " วัตถุที่เข้าร่วมในการระบุความสัมพันธ์ซึ่งจะเป็นคำศัพท์ที่ผิดปกติ)
NULL
เป็น "Not a value" (แทนที่จะเป็น "value NULL
" ตามที่ฉันเขียนบางครั้งก็เลอะเทอะ) ดังนั้น "ความสัมพันธ์ที่เป็นตัวเลือก" นั้นไม่ได้ขัดแย้งกับคำจำกัดความของ Referential Integrity
ObjectContext.DeleteObject
คืออะไร?
หากคุณต้องการใช้การลบจริง ๆ คุณต้องทำให้คีย์ต่างประเทศของคุณเป็นโมฆะ แต่คุณจะต้องจบด้วยระเบียนที่ไม่ได้ใช้งาน (ซึ่งเป็นหนึ่งในสาเหตุหลักที่คุณไม่ควรทำในตอนแรก) ดังนั้นเพียงแค่ใช้Remove()
ObjectContext.DeleteObject (เอนทิตี)ทำเครื่องหมายเอนทิตีเป็นลบในบริบท (มันคือ EntityState ถูกลบหลังจากนั้น) หากคุณโทร SaveChanges หลังจากนั้น EF จะส่งคำสั่ง SQL DELETE ไปยังฐานข้อมูล หากไม่มีข้อ จำกัด ในการอ้างอิงในฐานข้อมูลที่ถูกละเมิดเอนทิตีจะถูกลบออกมิฉะนั้นจะมีข้อผิดพลาดเกิดขึ้น
EntityCollection.Remove (childEntity)ทำเครื่องหมายความสัมพันธ์ระหว่าง parent และ childEntity เป็น Deleted หาก childEntity นั้นถูกลบออกจากฐานข้อมูลและสิ่งที่เกิดขึ้นเมื่อคุณโทร SaveChanges ขึ้นอยู่กับชนิดของความสัมพันธ์ระหว่างสอง:
สิ่งที่ควรสังเกตคือการตั้งค่า.State = EntityState.Deleted
ไม่ได้เรียกการเปลี่ยนแปลงที่ตรวจพบโดยอัตโนมัติ ( เก็บถาวร )