Как сделать сообщение Linq to Sql Delete Exception более удобным для пользователя - PullRequest
1 голос
/ 11 декабря 2010

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

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». Теперь я действительно хотел бы сообщить пользователю, что он не может удалить запись, так как на него ссылается эта таблица, упомянутая в исключении. Я не хотел бы разбирать текст, чтобы сделать это, это единственный способ? Также было бы очень хорошо, если бы я мог получить ссылку на запись, нарушающую ограничение, чтобы я мог сказать пользователю: «Вы не можете удалить документ A, на что ссылаются документы B, C и D ".

1 Ответ

1 голос
/ 11 декабря 2010

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

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

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

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

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

...