예제 #1
0
        public object GetCollection(object key, ISessionImplementor session, object owner)
        {
            ICollectionPersister persister          = GetPersister(session);
            IPersistenceContext  persistenceContext = session.PersistenceContext;
            EntityMode           entityMode         = session.EntityMode;

            if (entityMode == EntityMode.Xml && !isEmbeddedInXML)
            {
                return(UnfetchedCollection);
            }

            // check if collection is currently being loaded
            IPersistentCollection collection = persistenceContext.LoadContexts.LocateLoadingCollection(persister, key);

            if (collection == null)
            {
                // check if it is already completely loaded, but unowned
                collection = persistenceContext.UseUnownedCollection(new CollectionKey(persister, key, entityMode));
                if (collection == null)
                {
                    // create a new collection wrapper, to be initialized later
                    collection       = Instantiate(session, persister, key);
                    collection.Owner = owner;

                    persistenceContext.AddUninitializedCollection(persister, collection, key);

                    // some collections are not lazy:
                    if (InitializeImmediately(entityMode))
                    {
                        session.InitializeCollection(collection, false);
                    }
                    else if (!persister.IsLazy)
                    {
                        persistenceContext.AddNonLazyCollection(collection);
                    }

                    if (HasHolder(entityMode))
                    {
                        session.PersistenceContext.AddCollectionHolder(collection);
                    }
                }

                if (log.IsDebugEnabled)
                {
                    log.Debug("Created collection wrapper: " + MessageHelper.CollectionInfoString(persister, collection, key, session));
                }
            }
            collection.Owner = owner;
            return(collection.GetValue());
        }
예제 #2
0
        public async Task <object> GetCollectionAsync(object key, ISessionImplementor session, object owner, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            ICollectionPersister persister          = GetPersister(session);
            IPersistenceContext  persistenceContext = session.PersistenceContext;

            // check if collection is currently being loaded
            IPersistentCollection collection = persistenceContext.LoadContexts.LocateLoadingCollection(persister, key);

            if (collection == null)
            {
                // check if it is already completely loaded, but unowned
                collection = persistenceContext.UseUnownedCollection(new CollectionKey(persister, key));
                if (collection == null)
                {
                    // create a new collection wrapper, to be initialized later
                    collection       = Instantiate(session, persister, key);
                    collection.Owner = owner;

                    persistenceContext.AddUninitializedCollection(persister, collection, key);

                    // some collections are not lazy:
                    if (InitializeImmediately())
                    {
                        await(session.InitializeCollectionAsync(collection, false, cancellationToken)).ConfigureAwait(false);
                    }
                    else if (!persister.IsLazy)
                    {
                        persistenceContext.AddNonLazyCollection(collection);
                    }

                    if (HasHolder())
                    {
                        session.PersistenceContext.AddCollectionHolder(collection);
                    }
                }

                if (log.IsDebugEnabled())
                {
                    log.Debug("Created collection wrapper: {0}", MessageHelper.CollectionInfoString(persister, collection, key, session));
                }
            }
            collection.Owner = owner;
            return(collection.GetValue());
        }