Example #1
0
        /// <summary>
        /// Сохранение данных множества объектов.
        /// </summary>
        /// <remarks>
        /// Управление транзакцией внешнее.
        /// </remarks>
        /// <param name="context"></param>
        /// <param name="dataSet"></param>
        /// <param name="transactionID"></param>
        public static void Save(IXExecutionContext context, DomainObjectDataSet dataSet, Guid transactionID)
        {
            // #1: Вызов триггеров Before
            XTriggersController.Instance.FireTriggers(dataSet, XTriggerFireTimes.Before, context);

            // #2: Сбросим закэшированные данные объектов
            IEnumerator enumerator = dataSet.GetModifiedObjectsEnumerator(false);

            while (enumerator.MoveNext())
            {
                DomainObjectData xobj = (DomainObjectData)enumerator.Current;
                // Примечание: для новых объектов сбрасывать кэш бессмысленно - их там нет
                if (!xobj.IsNew)
                {
                    DomainObjectRegistry.ResetObject(xobj);
                }
            }

            // #3: Запись данных
            XDatagramProcessorEx dg_proc   = XDatagramProcessorMsSqlEx.Instance;
            XDatagramBuilder     dgBuilder = dg_proc.GetDatagramBuilder();
            XDatagram            dg        = dgBuilder.GetDatagram(dataSet);

            dg_proc.Save(context.Connection, dg);

            // #4: Сохранение chunked-данных
            saveChunkedData(transactionID, dg, context.Connection);

            // #5: Сигнализируем Securitymanager, что обновились данные (для очистки кэшей)
            XSecurityManager.Instance.TrackModifiedObjects(dataSet);

            // #6: Вызов триггеров After
            XTriggersController.Instance.FireTriggers(dataSet, XTriggerFireTimes.After, context);
        }
Example #2
0
        /// <summary>
        /// Удаление (forced) объекта с заданными типом и идентификатором.
        /// </summary>
        /// <remarks>
        /// Помимо самого удаления выполняется: вызов триггеров "до" и "после", очистка кэша в DomainObjectRegistry, уведомление XSecurityManager
        /// Управление транзакцией внешнее.
        /// </remarks>
        /// <param name="context">Контекcт ядра</param>
        /// <param name="sObjectType">Наименвоание типа объекта</param>
        /// <param name="objectID">Идентификатор</param>
        /// <returns>Реальное количество удаленных объектов</returns>
        public static int Delete(IXExecutionContext context, string sObjectType, Guid objectID)
        {
            DomainObjectData xobj = DomainObjectData.CreateToDelete(context.Connection, sObjectType, objectID);

            // #1: Вызов триггеров Before
            XTriggersController.Instance.FireTriggers(xobj.Context, XTriggerFireTimes.Before, context);

            // #2: Сбросим закэшированные данные объектa
            DomainObjectRegistry.ResetObject(xobj);

            // #3: Удаление объекта
            XDatagramProcessorEx dg_proc = XDatagramProcessorMsSqlEx.Instance;
            int nAffected = dg_proc.Delete(context.Connection, xobj);

            // #5: Сигнализируем Securitymanager, что обновились данные (для очистки кэшей)
            XSecurityManager.Instance.TrackModifiedObjects(xobj.Context);

            // #6: Вызов триггеров After
            XTriggersController.Instance.FireTriggers(xobj.Context, XTriggerFireTimes.After, context);

            return(nAffected);
        }