Linq-to-sql Удалить запись с ограничениями FK - PullRequest
1 голос
/ 22 сентября 2011

Возможно ли SubmitChanges и игнорировать удаления, которые вызывают ошибки ограничения внешнего ключа?

Скажем, у меня есть объект A и B. Первичный ключ B - это внешний ключ в A. Теперь я изменяю запись A, в которой я заменяю B, на другой B и удаляю исходный B. Ошибка произойдет, когда удаленный B упоминается в другой записи A (или в других таблицах, содержащих B в качестве внешнего ключа). Можно ли игнорировать ошибку и позволить внести изменения в базу данных, не удаляя старую B?

A rec_a = (from a in db.As where a.id == some_id).First();
B rec_b_old = rec_a.B;
rec_a.B = null;
db.Bs.DeleteOnSubmit(rec_b_old);
rec_a.B = some_other_b;
db.SubmitChanges();

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Сделайте два звонка на SubmitChanges():

A rec_a = (from a in db.As where a.id == some_id).First();
B rec_b_old = rec_a.B;
rec_a.B = null;
rec_a.B = some_other_b;
db.SubmitChanges();
db.Bs.DeleteOnSubmit(rec_b_old);
try
{
    db.SubmitChanges();
}
catch(SqlException) { } // Ignore failed delete.

Второй может потерпеть неудачу, и в этом случае просто проигнорируйте его. Можно попытаться отправить все, найти неудачное обновление / удаление, удалить его из списка ожидания и повторить попытку. Однако для этого требуется гораздо больше кода, поэтому я не думаю, что стоит делать это здесь.

Другое решение состоит в том, чтобы поместить в таблицу A триггер, который удаляет запись B, если она осиротела.

0 голосов
/ 22 сентября 2011

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

См. Операции вставки, обновления и удаления (LINQ to SQL) для подробного объяснения.

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