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