วัตถุซอมบี้ใน Entity Framework

ฉันสร้างเอนทิตีสองสามรายการใน Entity Framework พวกเขาจะถูกเพิ่มโดยอัตโนมัติ

คำถามที่ 1: เป็นเรื่องปกติหรือไม่ที่ MyEntity.CreateMyEntity จะเพิ่มเอนทิตีในบริบทโดยอัตโนมัติ

ตอนนี้ ฉันต้องการบันทึกไว้ แต่ถ้าพวกเขาฝ่าฝืนข้อจำกัดของฐานข้อมูล ฉันจะได้รับข้อยกเว้น ไม่มีอะไรคงอยู่ - ถูกต้อง แต่ - วัตถุเหล่านี้ยังคงอยู่ใน ObjectContext ที่ฉันไม่ต้องการ

ฉันพยายามเรียกใช้รหัสนั้นเป็น:

using (var t = new TransactionScope()) {
   ...create entities...
   try
   {
     context.SaveChanges();
     t.Complete();
     context.AcceptAllChanges();
   }
   catch
   {
      MessageBox.Show("Ooops");
   }
}

แต่แม้ว่าฉันจะใช้งานในธุรกรรม เอนทิตีเหล่านี้ยังคงอยู่ในบริบท

คำถามที่ 2: ฉันพลาดอะไรไป ฉันต้องลบมันออกด้วยตนเองหรือไม่?


person Cartesius00    schedule 18.06.2011    source แหล่งที่มา
comment
คุณสามารถแสดงโค้ดที่วัตถุที่สร้างด้วย MyEntity.CreateMyEntity แนบกับบริบทโดยอัตโนมัติได้หรือไม่   -  person Slauma    schedule 18.06.2011


คำตอบ (3)


อีกทางเลือกหนึ่งในการหลีกเลี่ยงออบเจ็กต์ที่ไม่ต้องการโดยไม่ต้องกำจัดบริบทคือการแยกออกด้วยตนเองหลังจากที่คุณได้คอมมิตการเปลี่ยนแปลงกับฐานข้อมูลโดยใช้ Detach():

คุณสามารถแยกวัตถุออกจากบริบทของวัตถุได้เมื่อไม่ต้องการใช้อีกต่อไป เมื่อต้องการทำเช่นนี้ เรียกวิธีการแยกออก ซึ่งจะช่วยลดจำนวนหน่วยความจำที่ใช้

context.Detach(yourEntity);

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

person BrokenGlass    schedule 18.06.2011

หากมีสิ่งผิดปกติเกิดขึ้น (ข้อยกเว้น) คุณต้องกำจัดบริบท (เพราะมันผิดอยู่แล้ว) และเริ่มต้นใหม่: สร้างบริบทข้อมูลใหม่ ดึงข้อมูลที่จำเป็น สร้างเอนทิตีใหม่ และอื่นๆ...

ป.ล. หรือคุณสามารถแก้ไขปัญหาและบันทึกบริบทได้

person VikciaR    schedule 18.06.2011

การเปลี่ยนแปลงทั้งหมดจะยังคงอยู่ในบริบทจนกว่าคุณจะลบการเปลี่ยนแปลงเหล่านั้น บันทึกไม่สำเร็จจะไม่ยกเลิกการเปลี่ยนแปลง CreateMyEntity คุณหมายถึงอะไร? การเปลี่ยนแปลงจะถูกเพิ่มในบริบทเมื่อคุณใช้ AddObject หรือเมื่อคุณอ้างอิงในเอนทิตีที่เพิ่มแล้ว

person Piotr Auguscik    schedule 18.06.2011