コード例 #1
0
        /// <summary>
        /// Eager loads any eager loaded properties.
        /// Honors the user specified "Graph()" relationships to load.
        /// </summary>
        /// <param name="ent">The parent entity.</param>
        /// <param name="rootQuery">The root query that specifies which children to load.</param>
        /// <param name="directChildrenLazyOrEager"></param>
        /// <param name="graphIndex">The current graph index.</param>
        public void LoadEagerLoadedProperties(object ent, QGen.QueryBuilder rootQuery, IEnumerable <EntityGraph> directChildrenLazyOrEager)
        {
            // Load eager loaded properties
            Type entType             = ent.GetType();
            var  mappedRelationships = _repos.Relationships[entType];

            foreach (var entGraphToLoad in directChildrenLazyOrEager.Where(g => g.Relationship.IsEagerLoaded))
            {
                var rel = mappedRelationships.Where(r => r.Member.Name == entGraphToLoad.Member.Name).FirstOrDefault();
                if (rel != null)
                {
                    using (var db = new RelationshipDataMapper(_db.ProviderFactory, _db.ConnectionString, rootQuery, entGraphToLoad.GraphIndex))
                    {
                        // NOTE: If parent _db is in a transaction, new db will be outside of that transaction.
                        try
                        {
                            object eagerLoadedValue = rel.EagerLoaded.Load(db, ent);
                            rel.Setter(ent, eagerLoadedValue);
                        }
                        catch (Exception ex)
                        {
                            var rtlEx = ex as RelationshipLoadException;
                            if (rtlEx != null)
                            {
                                throw;
                            }

                            throw new RelationshipLoadException(
                                      string.Format("Eager load failed for {0}.", entGraphToLoad.EntityTypePath),
                                      ex);
                        }
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Prepares any lazy loaded properties to be lazy loaded by substituting the lazy load proxy.
        /// Honors the user specified "Graph()" relationships to load.
        /// </summary>
        /// <param name="ent"></param>
        /// <param name="rootQuery"></param>
        public void PrepareLazyLoadedProperties(object ent, QGen.QueryBuilder rootQuery, IEnumerable <EntityGraph> directChildrenLazyOrEager)
        {
            // Handle lazy loaded properties
            Type entType             = ent.GetType();
            var  mappedRelationships = _repos.Relationships[entType];

            foreach (var entGraphToLoad in directChildrenLazyOrEager.Where(g => g.Relationship.IsLazyLoaded))
            {
                var rel = mappedRelationships.Where(r => r.Member.Name == entGraphToLoad.Member.Name).FirstOrDefault();
                if (rel != null)
                {
                    Func <IDataMapper> dbCreate = () =>
                    {
                        var db = new RelationshipDataMapper(_db.ProviderFactory, _db.ConnectionString, rootQuery, entGraphToLoad.GraphIndex);
                        db.SqlMode = SqlModes.Text;
                        return(db);
                    };

                    var lazyLoadedProxy = (ILazyLoaded)rel.LazyLoaded.Clone();
                    lazyLoadedProxy.Prepare(dbCreate, ent, entGraphToLoad.EntityTypePath);
                    rel.Setter(ent, lazyLoadedProxy);
                }
            }
        }