WedX - журнал о программировании и компьютерных науках

Удаление отношений LINQ-To-SQL и многие-ко-многим

У меня связь «многие ко многим» между двумя столами, скажем, «Друзья» и «Еда». Если другу нравится еда, я вставляю строку в таблицу FriendsFoods, например:

ID Friend Food
1 'Tom' 'Pizza'

FriendsFoods имеет первичный ключ «ID» и два ненулевых внешних ключа «Друг» и «Еда» для таблиц «Друзья» и «Еда» соответственно.

Теперь предположим, что у меня есть Friend tom .NET-объект, соответствующий «Тому», и Том больше не любит пиццу (что с ним не так?)

FriendsFoods ff = tom.FriendsFoods.Where(x => x.Food.Name == 'Pizza').Single();
tom.FriendsFoods.Remove(ff);
pizza.FriendsFoods.Remove(ff);

Если я попытаюсь SubmitChanges() в DataContext, я получаю исключение, потому что он пытается вставить нуль в столбцы Friend и Food в таблице FriendsFoods.

Я уверен, что смогу собрать какую-то запутанную логику для отслеживания изменений в таблице FriendsFoods, перехвата SubmitChanges() вызовов и т. Д., Чтобы попытаться заставить это работать так, как я хочу, но есть ли хороший, чистый способ удалить множество Отношения -To-Many с LINQ-To-SQL?

02.04.2010

Ответы:


1

Предполагая, что сама база данных имеет CASCADE DELETE правила, определенные для внешних ключей (в противном случае у вас возникнут проблемы), вам необходимо установить правило удаления для каждой связи в конструкторе Linq to SQL (или DeleteRule в AssociationAttribute) до CASCADE.

Вам также не нужно удалять обе стороны ассоциации - достаточно одной, либо от tom, либо от pizza.

Приложение: @Crispy также верен в том смысле, что интересующий вас атрибут real - это атрибут DeleteOnNull в дочерней ассоциации. Однако причина того, что вы не видите этого в конструкторе, заключается в том, что конструктор автоматически определяет значение этого свойства на основе (а) настройки CASCADE связи родитель-потомок, и (b) является ли поле внешнего ключа допускающим значение NULL. Если у вас есть FK, не допускающий значения NULL, с CASCADE DELETE в конструкторе Linq to SQL, он должен автоматически установить DeleteOnNull = true для связи дочернего с родительским и впоследствии удалить запись из таблицы сопоставления вместо попытки установить для ее сопоставлений значение NULL.

02.04.2010
  • Разве это не удалит одновременно сущности «Том» и «Пицца»? 03.04.2010
  • @ Джейк: Нет, CASCADE меняется с Friend на FriendsFoods и с Food на FriendsFoods. Запись tom.FriendsFoods.Remove(ff) не приведет к удалению ни tom, ни записи pizza. 03.04.2010
  • Итак, это работает. Спасибо! Я был немного сбит с толку, потому что у меня в голове были перевернутые отношения между родителями и детьми, но теперь все это имеет смысл. В итоге я установил для правила удаления значение «Каскад» в конструкторе SQL Server Management Studio, потому что не смог найти ничего, относящегося к правилу удаления в конструкторе LINQ-To-SQL. 06.04.2010

  • 2

    Если вы пытаетесь удалить запись из таблицы «многие-ко-многим» (FriendFoods), удалив ее из дочерней коллекции сущности linq, вам необходимо установить атрибут DeleteOnNull для отношения, равный true в dbml файл. К сожалению, вы не можете сделать это через дизайнер dbml. Вам необходимо открыть файл .dbml как файл xml, а затем вручную отредактировать xml ассоциации.

    См. Как удалить записи из дочерней коллекции в LINQ to SQL?

    02.04.2010

    3

    КАСКАДНОЕ УДАЛЕНИЕ здесь не применяется. Это применимо только в случае удаления сущности, объекта Friend или объекта Food, но не в том случае, если вы просто хотите удалить связь. Есть ли причина, по которой вы не обращаетесь напрямую к реляционной таблице? Я думаю, что это было бы намного более чистым решением.

    02.04.2010
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]