Как сделать сообщение об исключении Linq to Sql Delete Exception более удобным для пользователя

Я хотел бы сообщить пользователю точную причину, по которой запись не может быть удалена, у меня есть этот код для выполнения удаления:

try{
    var table = Context.GetTable<TRecordType>();
    lock (table) {
                    table.DeleteOnSubmit(recordToDelete);
                    Context.SubmitChanges();
                 }                
    catch (Exception ex)  {
                //Put back record                  
                throw new Exception("Could not perform dataservice delete operation", ex);
            }

Как видите, это довольно просто, но обычно запись не может быть удалена из-за ограничения внешнего ключа, поэтому я получаю это SQLException с сообщением вроде: «Оператор DELETE конфликтует с ограничением REFERENCE« FK_Something »... Возник конфликт в базе данных «X», таблица «dbo.Department», столбец «DepartmentId». Теперь то, что я действительно хотел бы сделать, это по крайней мере сообщить пользователю, что он не может удалить запись, потому что на нее ссылается эта таблица, упомянутая в исключении. I ' Я ненавижу анализировать текст для этого, это единственный способ? Также было бы очень хорошо, если бы я мог получить ссылку на запись, нарушающую ограничение, чтобы я мог сказать пользователю: «вы не можете удалить документ A, поскольку упоминается в документах B, C и D ".


person user582503    schedule 11.12.2010    source источник


Ответы (1)


Начните с ловли конкретно SQLException, поскольку это то, с чем вы работаете.

Во-вторых, проверьте, является ли исключение именно тем, которое вы «ожидаете». Вам нужно будет либо обработать другие SQLException, либо перебросить их.

Вам нужно будет проанализировать текст (отсортировать - просто используйте RegEx), потому что это сообщение, которое было возвращено с SQL Server. Он ссылается на имена таблиц и ограничения базы данных, а не на объекты или что-то еще, о чем знает ваше приложение.

Конечно, у вас есть ссылка на запись, которую нельзя удалить, в переменной recordToDelete.

У вас также есть ваша модель LINQ-to-SQL, поэтому вы потенциально можете пройти по связям с этой записью, чтобы идентифицировать документы, которые на нее ссылаются.

person Jay    schedule 11.12.2010