C# NHibernate按类型和Id从一级缓存逐出

C# NHibernate按类型和Id从一级缓存逐出,c#,nhibernate,caching,C#,Nhibernate,Caching,我有一个名为Car的Nhibernate对象,这个Car对象有一个名为Doors的PersietentBag IList集合,都在惰性加载中 如果我这样做(在第1课时) lazyest集合从db加载,相关对象添加到一级缓存中,i将在一级缓存中从db加载N个对象汽车和N个门 从另一方面(在会话2中代码的其他部分),我加载相同的Car对象并执行相同的分配 int singleDoor = Car,Doors[0]; 我从会话2中逐出了汽车和所有的门对象 我修改了这些对象的状态,并希望将doscon

我有一个名为Car的Nhibernate对象,这个Car对象有一个名为Doors的PersietentBag IList集合,都在惰性加载中

如果我这样做(在第1课时)

lazyest集合从db加载,相关对象添加到一级缓存中,i将在一级缓存中从db加载N个对象汽车和N个门

从另一方面(在会话2中代码的其他部分),我加载相同的Car对象并执行相同的分配

int singleDoor = Car,Doors[0];
我从会话2中逐出了汽车和所有的门对象

我修改了这些对象的状态,并希望将doscontected对象附加到SESSION1以保存nd do

mySession.Update(Car);
但是当我尝试更新Door(s)obejct时,显然会抛出(具有相同id的另一个obejct等)异常,因为还有另一个具有相同id的对象

Bot很难找到要逐出的旧对象,如何逐出旧对象或清除一级缓存(仅按类型和id),或从缓存中丢弃旧对象并更新所需内容


提前感谢。

这不是因为第二级缓存,而是因为您正在尝试从会话2中保存实体,而该实体已在会话1中加载(事实上,是第一级缓存导致了这种情况)


您的问题的答案是(在会话1中)使用session.execute(car),但这并不是最好的方法-我建议使用session.Merge(car),它将更新会话1中的持久对象,而不会引发关于另一个具有相同id的对象的异常。

这不是因为二级缓存,这是因为您正试图从会话2中保存实体,而该实体已在会话1中加载(事实上,是第一级缓存导致了这种情况)


您的问题的答案是(在会话1中)使用session.execute(car),但这并不是最好的方法-我建议使用session.Merge(car),它将更新会话1中的持久对象,而不会引发另一个具有相同id的对象的异常。

谢谢,我更正了错误,这是一级缓存,实际上是会话。退出(Car)不是最好的方法,但是我手头没有要退出的旧车对象,使用合并方法,如果我在旧车上有状态更改,两辆车的状态更改是否已合并?还是旧车状态的改变消失了?我需要放弃旧车状态,提前感谢。您可以执行session.Get(id)从会话中获取它,然后将其逐出,但是如果它首先不在会话中,这将导致数据库产生不必要的负载。会话。合并将用新的覆盖旧的汽车状态-即。它将丢弃旧的汽车状态(如果您希望它合并任何子集合,那么您需要将集合级联设置为“合并”),谢谢,我更正了错误,这是一级缓存,事实上是会话。逐出(汽车)不是最好的方法,但是,我手头没有旧车对象要驱逐,使用合并方法,如果我在旧车上有状态更改,那么两辆车的状态更改已经合并了吗?还是旧车状态的改变消失了?我需要放弃旧车状态,提前感谢。您可以执行session.Get(id)从会话中获取它,然后将其逐出,但是如果它首先不在会话中,这将导致数据库产生不必要的负载。合并将用新的覆盖旧的汽车状态-即,它将丢弃旧的汽车状态(如果您希望它也合并任何子集合,那么您需要将集合级联设置为“合并”)
mySession.Update(Car);