Используемые ссылки на мастера
Данная статья затрагивает вопрос отмены удаления значений из таблицы, хранящей мастера, используемые в других объектах.
Вопрос о том, как удалить значения, рассматривается в статье Каскадное удаление объектов.
Попытка удаления мастера
Пусть дана следующая диаграмма:
Если в базе данных есть объекты типа Клиент
, ссылающиеся на него, то при попытке удаления объекта типа Адрес
будет выведена ошибка:
База данных не даст удалить такой объект, а пользователю выдастся неинформативное сообщение.
Решение проблемы
Для решения данной проблемы стоит воспользоваться бизнес-сервером удаляемого объекта:
- Узнать количество объектов, ссылающихся на удаляемый.
- Если оно не равно 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));
}
}
В результате, при попытке удалить адрес, по которому прописаны клиенты, пользователю выдастся следующее сообщение:
Сообщение изменилось на более информативное.