Удаление FK, когда нет связанной записи (linq-to-sql) - PullRequest
4 голосов
/ 08 февраля 2010

Задача

У меня есть две связанные таблицы с внешним ключом, который не применяет ограничения FK. В «дочерней» таблице должно быть разрешено указывать «родительский» ключ, который имеет значение NULL или не существует идентификатора.

Мой доступ к данным построен с использованием Linq2Sql, и он генерирует отношение «один ко многим» в модели моих таблиц.

Проблема заключается в некотором коде очистки, который ежедневно просматривает все изменения за последний день и исправляет любые «ошибки» в данных.

Пример

foreach (var user in data.Users)
{
    // Check if the user has a specified office, which does not exists.
    if (user.OfficeId != null && user.Office == null)
    {
        user.OfficeId = null; // This throws exception
    }
}

Исключение: System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException: операция недопустима из-за текущего состояния объекта

Это нормальное поведение и несколько ожидаемое, поэтому я попытался установить эталонный объект. Но как мне определить «пустой» офис?

var emptyOffice = new Office();
user.Office = emptyOffice;

Приведенный выше код устанавливает для OfficeId значение NULL для пользовательского экземпляра, но, очевидно, он завершается ошибкой во время обновления, когда пытается добавить новый «пустой» Office в базу данных.

Возможное решение

Мне осталось запустить собственный SQL, который выполняет обновление, хотя было бы неплохо сделать это через Linq2Sql, поскольку в той же строке, которую я обновляю, есть другие столбцы, которые я обновляю » родитель "не существует.

Примечания * * 1023 Здесь есть некоторые требования, которые важны для любых комментариев: База данных не может быть изменена. Несколько систем зависят от одной и той же схемы базы данных. Потенциально может перейти на Entity Framework, если он поддерживает такой сценарий. Запуск пользовательского SQL не проблема, и я буду делать это, пока не найду лучшее решение. Хотелось бы узнать и узнать, как это сделать без какого-либо специального кода.

1 Ответ

1 голос
/ 08 февраля 2010

В моем коде применены FK, поэтому я не проверял это, но вы пытались явно установить

user.Office = null;

Это также должно привести к тому, что значение FK OfficeId также станет нулевым.

Если это не сработает, то, безусловно, должно быть следующее:

user.Office = new Office(); // or keep a cached dummy Office object to save time
user.Office = null;

Это заставит ссылку FK понять, что ее значение было изменено и установлено равным нулю.

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