Решение проблем неинформативных сообщений при удалении объекта

Используемые ссылки на мастера

Данная статья затрагивает вопрос отмены удаления значений из таблицы, хранящей мастера, используемые в других объектах.

Вопрос о том, как удалить значения, рассматривается в статье Каскадное удаление объектов.

Попытка удаления мастера

Пусть дана следующая диаграмма:

Если в базе данных есть объекты типа Клиент, ссылающиеся на него, то при попытке удаления объекта типа Адрес будет выведена ошибка:

База данных не даст удалить такой объект, а пользователю выдастся неинформативное сообщение.

Решение проблемы

Для решения данной проблемы стоит воспользоваться бизнес-сервером удаляемого объекта:

  • Узнать количество объектов, ссылающихся на удаляемый.
  • Если оно не равно 0, выбросить исключение с понятным пользователю описанием проблемы.
  • При необходимости, перехватить исключение и обработать особым образом.

Пример

Для описаных выше условий: добавить проверку в бизнес-сервер класса Адрес:

if (UpdatedObject.GetStatus() == ObjectStatus.Deleted)
{
    // Найдем количество клиентов, ссылающихся на удаляемый адрес.
    var ds = (MSSQLDataService)DataServiceProvider.DataService;
    var clientsCount = ds.Query<Клиент>(Клиент.Views.КлиентE).Where(k => k.Прописка.__PrimaryKey == UpdatedObject.__PrimaryKey).Count();

    // Если клиентов не 0, выкинем исключение.
    if (clientsCount != 0)
    {
        throw new Exception(string.Format("Невозможно удалить Адрес. По данному адресу проживает {0} клиент(а)(ов)", clientsCount));
    }
}

В результате, при попытке удалить адрес, по которому прописаны клиенты, пользователю выдастся следующее сообщение:

Сообщение изменилось на более информативное.