Как снизить вероятность возникновения ошибок связанных с внешними ключами?
Добрый день, у меня процессы массово добавляют или изменяют записи в системе, но бывает происходит так что выходят ошибки связанные с внешними ключами
Есть ли какой то способ свести возникновение таких ошибок к минимуму?
Нравится
Дмитрий, нужно подробно анализировать по каждому отдельному случаю, ведь они свидетельствуют, что что-то в логике не учли и либо идёт попытка добавления записи с одним Id несколько раз из одного или разных мест, либо подставляется неправильный Id для внешнего ключа справочного поля.
Зверев Александр,
т.е если я редактирую запись и оно заполнено значением , которое я подставляю . то может возникнут такая ошибка
Т.е к примеру у нас в поле есть контрагент А и я на вебсервисе заполняю код тоже контрагентом А
А обходить это стоит проверкой на соответствие полей по типу A != A или проверкой на null?
А как быть если ошибка возникает при добавлении записи, т.е это может свидетельстовать о том. что поле при создании уже заполнено по умолчанию?
Не совсем понял, что Вы делаете. При редактировании записи ошибка со внешними ключами может быть, если в справочное поле пишут Id несуществующей в справочнике записи. При добавлении, помимо этого, ошибка, если пытаются вставить две записи с одинаковым Id. Это не зависит, осуществляется ли вставка в клиентской логике, серверной, в БП или по интеграции. В итоге всё равно это всё превращается в SQL-запросы к базе.
Ошибки со внешними ключами могут быть только в одном случае. В колонку сохраняется Id объекта не того, на который смотрит колонка. Например в есть колонка справочного типа Контрагент, а пытается подставиться идентификатор контакта или заказа.
Чтобы такого не было нужно при создании логики (JS, C#, БП) внимательно следить за такими случаями, и не устанавливать какие-попало значения в колонки.
Так же один из самых частых случаев - это когда пытаются установить пустой идентификатор в значение колонки. Важно помнить, что Guid.Empty и null - это разные вещи. Поэтому перед установко желательно всегда делать проверку на Guid.Empty.
Владислав Литвинчук пишет:
Ошибки со внешними ключами могут быть только в одном случае. В колонку сохраняется Id объекта не того, на который смотрит колонка.
Или было зашито Id определённой записи в справочнике, а пользователи не знали и её удалили. Или на базе разработки и основном сайте записи в справочнике создавались независимо и имеют разные Id при одинаковом текстовом значении для отображения.
Владислав Литвинчук,
А если ошибка всё равно возникает? В условии для обновления записи смотрю на пришедшее поле FK, и если оно пустое, то не должно заполняться. Логика простая в условии: if (!моеПоле.Equals(Guid.Empty))
При этом считывание происходит из select запроса с явным подставлением Guid: .ExecuteScalar<Guid>();
Но вот у меня условие всё равно не срабатывает, ведь если оно пустое, то я просто не делаю обновление данного поля (или каких-либо других справочных полей), но ошибка по FK падает