Задача
У меня есть две связанные таблицы с внешним ключом, который не применяет ограничения 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 не проблема, и я буду делать это, пока не найду лучшее решение.
Хотелось бы узнать и узнать, как это сделать без какого-либо специального кода.