Проверка нарушения ссылочной целостности перед удалением в ASP .NET MVC - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть объект Tag, связанный с целой кучей других объектов. Я пытаюсь обработать Delete для этого объекта. Я просто не хочу удалять тег, если он связан с какими-либо другими объектами.

На данный момент я решаю это так:

if(tag.Stands.Count == 0 && tag.Skids.Count == 0
   && tag.Panels.Count == 0 && tag.Devices.Count == 0
   && tag.Cables.Count == 0 && tag.JunctionBoxes.Count == 0)
{
    _db.Tags.DeleteObject(tag);
    _db.SaveChanges();
}

Если я не проверяю все эти вещи, я, очевидно, получаю ошибку ограничения ссылки, например,

System.Data.SqlClient.SqlException: оператор DELETE конфликтовал с ограничением ССЫЛКА "FKStandTag237968".

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

Есть ли способ, с помощью Entity Framework, который я могу проверить, не нарушу ли я никаких ограничений для БД перед попыткой сохранить удаление? Что-то вроде _db.IsValidToDelete(object)?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Btw. каждый вызов, такой как tag.Stands.Count, будет загружать все связанные Stands из базы данных в ваше приложение, поэтому, если у вас много связей и каждый содержит много сущностей, эта проверка будет чертовски дорогой и медленной.

Вы можете использовать совет @ Eranga и поймать исключение или создать хранимую процедуру для удаления тега.

2 голосов
/ 27 сентября 2011

Наличие такого метода (_db.IsValidToDelete(object)) не гарантирует, что его можно безопасно удалить. Ваше приложение является многопользовательским приложением. Таким образом, один пользователь может связать тег, когда другой пользователь пытается удалить его.

Так что лучшей альтернативой было бы позволить пользователю удалить тег и перехватить исключение, чтобы проверить, является ли это нарушением ссылочной целостности.

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