Я использую LINQ-to-SQL для загрузки данных из базы данных, в которой есть две таблицы, в отношении «один ко многим» (один рецепт имеет много ингредиентов).
Я загружаю Recipe, а LINQ извлекает объекты Ingredient в EntitySet, который связан с ListBox.
Если я хочу удалить некоторые ингредиенты из рецепта, я получаю сообщение «Была сделана попытка удалить связь между рецептом и ингредиентом. Однако один из внешних ключей отношения (Ingredient.RecipeID) не может быть установлен в ноль.
Я решил эту проблему, используя хорошо известное решение, добавив DeleteOnNull = "true" в файл DBML. Но добавление этого параметра устраняет проблему только при удалении объектов Ingredient, которые были извлечены из БД.
Проблема в объектах Ingredient, которые были созданы в коде (добавлены в рецепт) и добавлены в коллекцию EntitySet Ingredients, а затем удалены, прежде чем вызывается SubmitUpdates. Затем то же самое исключение повторяется снова. Это обычно происходит по новому несохраненному рецепту, когда пользователь добавляет ингредиенты к нему, совершает ошибку и удаляет ингредиент из рецепта. Я добавил DeleteOnNull в обе строки 'Association Name = "Recipe_Ingredient" "в DBML.
Как я должен удалить такие объекты? Единственное решение, которое я вижу на данный момент, заключается в том, что я загружаю ингредиенты в коллекцию, не находящуюся в DataContext, а затем при сохранении удаляю все ингредиенты из рецепта и добавляю их снова из этого кэша.