我有一个名为Car的Nhibernate对象,这个Car对象有一个名为Doors的PersietentBag IList集合,所有这些都是延迟加载的。
如果我这样做(在会议1中)
int singleDoor = Car.Doors[0];
lazyest集合从db加载并且相关对象被添加到第一级缓存中,i将在第一级缓存N对象Car和N Doors从db加载。
从另一只手(在代码IN SESSION 2的其他部分)我加载相同的Car对象并做同样的分配
int singleDoor = Car,Doors[0];
和我从SESSION2驱逐汽车和所有门对象
我修改了这个对象的状态,并希望附加doscontected对象,将SESSION1附加到save nd do
mySession.Update(Car);
但是当我尝试更新门(s)obejcts显然我有(另一个具有相同id等的obejct)异常被抛出,因为还有另一个具有相同id的对象。
很难找到要驱逐的旧对象,我怎样才能对旧对象进行EVICT或清除第一级缓存(仅按类型和ID)或从缓存中丢弃旧对象并更新我想要的内容?
提前感谢。
答案 0 :(得分:3)
这不是因为二级缓存,而是因为你试图在会话2中加载已经在会话1中加载的实体(实际上它是引起这种情况的第一级缓存)。
您的问题的答案是使用(在会话1中),session.Evict(汽车),但这不是真正的最佳方法 - 我宁愿建议使用session.Merge(car)来更新持久对象会话1没有抛出有关具有相同id的另一个对象的异常。