ดูเหมือนว่าจะเป็นปัญหาทั่วไป แต่ฉันไม่ทราบวิธีแก้ปัญหาที่ดีที่สุด ฉันต้องการที่จะส่งเอนทิตีไปยังมุมมอง มีการเปลี่ยนแปลงกับเอนทิตีในมุมมอง แต่จากนั้นยกเลิก (ลบ) การเปลี่ยนแปลงเหล่านั้นหากผู้ใช้ยกเลิกออกจากมุมมอง วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร
นี่คือสองตัวเลือกที่ฉันมี แต่ฉันคิดว่าควรมีตัวเลือกอื่นที่ดีกว่า
1) นำเอนทิตี สร้างโคลน ส่งโคลนไปที่มุมมอง...หากยอมรับการเปลี่ยนแปลง ให้อัปเดตเอนทิตีดั้งเดิมด้วยค่าของโคลน
2) ส่งเอนทิตีไปยังมุมมอง หากผู้ใช้ยกเลิก ให้ลบเอนทิตีออกจากแคชของ NHibernate แล้วโหลดซ้ำจากฐานข้อมูล
สำหรับ (2) ปัญหาสำหรับฉันคือยังคงสามารถอ้างอิงเอนทิตีเก่าได้ตลอดทั้งโปรเจ็กต์ของฉัน หลังจากที่ถูกลบออกจากแคชแล้ว
แก้ไข:
ตกลง ดังนั้นวิธีขับไล่คือหนทางที่จะไปหากฉันกำลังใช้วิธี (2) ขอบคุณครับ จำรายละเอียดไม่ได้แล้ว อย่างไรก็ตาม ปัญหาของการดูออบเจ็กต์ที่อ้างอิงถึงเอนทิตีเก่าของฉันที่ถูกขับไล่ ทำให้ปัญหานี้ยากต่อการจัดการ ฉันไม่สามารถให้มุมมองของฉันอัปเดตเป็นเอนทิตีใหม่โดยอัตโนมัติโดยไม่ต้องมีโค้ดที่กำหนดเองในแต่ละรายการเพื่อเชื่อมโยงใหม่เมื่อเหตุการณ์การขับไล่แบบกำหนดเองของฉันถูกหยิบยกขึ้นมา และการรีดิ้งอาจไม่เป็นเรื่องเล็กน้อยในบางกรณี ฉันต้องคิดเรื่องนี้ให้มากกว่านี้เพราะฉันอาจจะซับซ้อนเกินไป แต่ในขณะนี้ วิธีนี้ดูยุ่งยากกว่า
ฉันสงสัยว่าฉันจะติดอยู่กับวิธีที่ (1) ซึ่งมีปัญหาของตัวเอง แต่จะรออีกสักหน่อยเพื่อดูว่ามีใครมีแนวคิดบ้างไหม
แก้ไข 2: เพิ่งพบสิ่งนี้ ฉันคิดว่ามันครอบคลุมคำตอบในรายละเอียดค่อนข้างมาก และมาพร้อมกับโครงการสาธิตที่ยอดเยี่ยม - การสร้างแอปพลิเคชัน To-Do บนเดสก์ท็อปด้วย NHibernate - http://msdn.microsoft.com/en-us/นิตยสาร/ee819139.aspx
นอกจากนี้ NHibernate ยังมีฟังก์ชัน Session.Refresh(Object Entity) ซึ่งดูเหมือนว่าจะแก้ปัญหาได้ตรงจุด ดังนั้น เมื่อเอนทิตีมีการเปลี่ยนแปลงแต่ถูกยกเลิกก่อนที่จะบันทึก ฉันสามารถเรียก Session.Refresh เพื่อโหลดซ้ำจากฐานข้อมูลและละทิ้งการเปลี่ยนแปลง
Refresh
เกิดขึ้นเมื่อเอนทิตีมีความสัมพันธ์แบบเรียงซ้อน จากนั้นรายการย่อยเหล่านั้น (เอนทิตีที่เกี่ยวข้อง) จะถูกรีเฟรชด้วย ซึ่งอาจทำให้เกิดผลกระทบต่อประสิทธิภาพที่เห็นได้ชัดเจน ฉันเพิ่งประสบปัญหาที่ฉันอธิบาย ดังนั้นข้อมูลนี้อาจช่วยเหลือผู้อื่นได้ - person jweyrich   schedule 21.12.2015