public void RemoveRelation(IRelationById item, AbstractScopedCache repositoryScopedCache) { var sessionIdAsString = GetSessionId().ToString("n"); using (DisposableTimer.TraceDuration <NhSessionHelper>("In RemoveRelation for session " + sessionIdAsString, "End RemoveRelation for session " + sessionIdAsString)) { var relationType = GetOrCreateNodeRelationType(item.Type.RelationName, repositoryScopedCache); // Nh should handle this for us but got an error with mappings atm in SqlCe (APN 09/11/11) // Clear session cache to make sure it loads all of the tags in order to delete them all NhSession.Flush(); // Clear the repository cache of this relation in case one has been added and then removed in the same unit of work var cacheKey = GenerateCacheKeyForRelation(item, relationType); repositoryScopedCache.InvalidateItems(cacheKey); var sourceIdValue = (Guid)item.SourceId.Value; var destinationIdValue = (Guid)item.DestinationId.Value; var existingRelation = GetDbRelation(relationType.Alias, sourceIdValue, destinationIdValue).ToArray(); if (existingRelation.Any()) { existingRelation.ForEach(x => NhSession.Delete(x)); } } }
public void MapAndMerge <T>(Revision <T> entity, MappingEngineCollection mappers) where T : class, IVersionableEntity { HiveId hiveId = entity.MetaData != null ? entity.MetaData.Id : HiveId.Empty; HiveId entityId = entity.Item != null ? entity.Item.Id : HiveId.Empty; using (DisposableTimer.TraceDuration <NhSessionHelper>("Start MapAndMerge for revision " + hiveId + " entity " + entityId, "End MapAndMerge")) using (NhProfilerLogging.Start(NhSession, "MapAndMerge<T> (Revision<T>)", new OdbcParameter("entity", entity))) { var rdbmsEntity = mappers.MapToIntent <IReferenceByGuid>(entity); // Track ID generation on the Rdbms object so that it can be pinged to the AbstractEntity upon Save/Update commit rdbmsEntity = NhSession.Merge(rdbmsEntity) as IReferenceByGuid; // 16th Jan 12 (APN) NH is not flushing if the above merged entity is queried before the transaction is committed, despite // the flushmode being Auto. So, explicit call to Flush here pending a bugfix/ better solution NhSession.Flush(); //InnerDataContext.NhibernateSession.SaveOrUpdate(rdbmsEntity); mappers.Map(rdbmsEntity, entity, rdbmsEntity.GetType(), entity.GetType()); } }