NHibernate Evict ตามประเภทและรหัสจากแคชระดับแรก

ฉันมีวัตถุ Nhibernate ที่เรียกว่า Car วัตถุ Car นี้มีคอลเลกชัน PersietentBag IList ที่เรียกว่า Doors ทั้งหมดนี้อยู่ในการโหลดแบบ Lazy Loading

ถ้าฉันทำ (ในเซสชั่น 1)

int singleDoor = Car.Doors[0];

คอลเลกชันที่ขี้เกียจที่สุดโหลดจาก db และวัตถุที่เกี่ยวข้องจะถูกเพิ่มลงในแคชระดับแรก i จะมีในแคชระดับที่ 1 N วัตถุ Car และ N Doors โหลดจาก db

จากอีกด้านหนึ่ง (ที่ส่วนอื่นของโค้ดในเซสชัน 2) ฉันโหลดวัตถุ Car เดียวกันและทำภารกิจเดียวกัน

int singleDoor = Car,Doors[0];

และขับไล่รถยนต์และวัตถุประตูทั้งหมดออกจากเซสชั่น 2

ฉันแก้ไขสถานะของวัตถุนี้และต้องการแนบวัตถุ doscontected tu SESSION1 เพื่อบันทึกและทำ

mySession.Update(Car);

แต่เมื่อฉันพยายามอัปเดต obejcts ของประตูเห็นได้ชัดว่าฉันมีข้อยกเว้น (obejct อื่นที่มี id เดียวกัน ฯลฯ) ถูกส่งออกไปเนื่องจากยังมีวัตถุอื่นที่มี id เดียวกัน

บอทเป็นเรื่องยากที่จะค้นหาวัตถุเก่าที่จะขับไล่ ฉันจะกำจัดวัตถุเก่าหรือล้างแคชระดับที่ 1 ได้อย่างไร (ตามประเภทและรหัสเท่านั้น) หรือทิ้งวัตถุเก่าออกจากแคชและอัปเดตสิ่งที่ฉันต้องการ

ขอบคุณล่วงหน้า.


person manuellt    schedule 22.05.2012    source แหล่งที่มา


คำตอบ (1)


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

คำตอบสำหรับคำถามของคุณคือการใช้ (ในเซสชัน 1), session.Evict(car) อย่างไรก็ตามนั่นไม่ใช่วิธีที่ดีที่สุด - ฉันอยากจะแนะนำให้ใช้ session.Merge(car) ซึ่งจะอัปเดตวัตถุถาวรในเซสชัน 1 โดยไม่มี โยนข้อยกเว้นเกี่ยวกับวัตถุอื่นที่มีรหัสเดียวกัน

person Martin Ernst    schedule 22.05.2012
comment
ขอบคุณ ฉันแก้ไขข้อผิดพลาดแล้ว มันเป็นแคชระดับที่ 1 อันที่จริงเซสชัน Evict (Car) ไม่ใช่แนวทางที่ดีที่สุด แต่ฉันไม่มีวัตถุ Car เก่าในมือ Evict ด้วยวิธี Merge ถ้าฉันมี การเปลี่ยนแปลงสถานะที่รถเก่า การเปลี่ยนแปลงสถานะรถยนต์ 2 คันได้รวมเข้าด้วยกันแล้ว? หรือสภาพรถเก่าที่เปลี่ยนหายไป? ฉันต้องทิ้งสถานะรถเก่า ขอบคุณล่วงหน้า - person manuellt; 22.05.2012
comment
คุณสามารถทำ session.Get‹Car›(id) เพื่อดึงมันออกจากเซสชั่นแล้วจึงไล่มันออกไป อย่างไรก็ตาม ถ้ามันไม่อยู่ในเซสชั่นตั้งแต่แรก นี่จะทำให้มีการโหลดที่ไม่จำเป็นจากฐานข้อมูล Session.Merge จะเขียนทับสถานะของรถเก่าด้วยสถานะใหม่ - เช่น มันจะละทิ้งสถานะของรถเก่า (หากคุณต้องการให้รวมคอลเลกชันย่อยใด ๆ คุณต้องตั้งค่าน้ำตกให้รวมเข้าด้วยกัน) - person Martin Ernst; 22.05.2012