Пример #1
0
        /// <summary>
        /// Cascade an action from the parent entity instance to all its children.  This
        /// form is typically called from within cascade actions.
        /// </summary>
        /// <param name="persister">The parent's entity persister </param>
        /// <param name="parent">The parent reference. </param>
        /// <param name="anything">
        /// Typically some form of cascade-local cache
        /// which is specific to each CascadingAction type
        /// </param>
        public void CascadeOn(IEntityPersister persister, object parent, object anything)
        {
            if (persister.HasCascades || action.RequiresNoCascadeChecking)
            {
                log.Info("processing cascade {0} for: {1}", action, persister.EntityName);

                IType[]        types         = persister.PropertyTypes;
                CascadeStyle[] cascadeStyles = persister.PropertyCascadeStyles;
                var            uninitializedLazyProperties = persister.GetUninitializedLazyProperties(parent);
                for (int i = 0; i < types.Length; i++)
                {
                    CascadeStyle style        = cascadeStyles[i];
                    string       propertyName = persister.PropertyNames[i];
                    if (uninitializedLazyProperties.Contains(propertyName) && persister.PropertyLaziness[i] && !action.PerformOnLazyProperty)
                    {
                        //do nothing to avoid a lazy property initialization
                        continue;
                    }

                    if (style.DoCascade(action))
                    {
                        CascadeProperty(parent, persister.GetPropertyValue(parent, i), types[i], style, propertyName, anything, false);
                    }
                    else if (action.RequiresNoCascadeChecking)
                    {
                        action.NoCascade(eventSource, persister.GetPropertyValue(parent, i), parent, persister, i);
                    }
                }

                log.Info("done processing cascade {0} for: {1}", action, persister.EntityName);
            }
        }