/// <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); } } } } }
/// <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); } } }