Удаление родительского объекта ограничения FK в Entity Framework и SQL Server - PullRequest
0 голосов
/ 06 июля 2011

Я использую Entity Framework с .NET 4.0 и SQL Server 2008.

У меня есть две сущности A и B, A имеет много B (есть a поле в таблице B, т.е. B -> много к одному -> A).Когда я пытаюсь удалить конкретную родительскую сущность A, запрос не выполняется

A - родительская сущность, B - дочерняя сущность.

Вот код, который я использую дляудаление конкретного объекта A: -

var obj = (from A in context.As where A.id=someValue select A).First();
context.As.DeleteObject(obj);
context.SaveChanges();

Однако оно выдает известное исключение

Оператор DELETE конфликтует с ограничением REFERENCE "FK_bs_as".Конфликт произошел в базе данных «myDb», таблице «dbo.bs», столбце «a».

Оператор был прерван.

Затем я посмотрел на ограничение внешнего ключаиспользуя SQL Server Management Studio и отредактировал FK следующим образом:

  • правило удаления: каскад
  • правило обновления: каскад
  • принудительное ограничение внешнего ключа: нет

и попытался установить FK на ON DELETE CASCADE.Однако очевидно, что с этим все еще есть проблема.

Я не хочу получать каждую чертову дочернюю сущность (B) родительской сущности (A) и удалять их по отдельности.Это слишком дорого по сравнению с выполнением одного запроса SQL.

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

Что вам нужно сделать, это:

  • Установка правила удаления в базе данных, как вы сделали (не устанавливайте правило обновления и не изменяйте принудительные ограничения!)
  • Установка правила удаления для отношения в EDMX

Первый шаг будет гарантировать, что каскадное удаление будет работать, если ваши связанные объекты не загружены, а второй шаг будет гарантировать, что каскадное удаление будет работать, если ваши связанные объектызагружены.Оба шага необходимы.

Как только вы это сделаете, вам не нужно загружать связанные сущности и удалять их по одному.

0 голосов
/ 05 февраля 2013
  • Установите в ассоциации между A и B OnDelete до Cascade в EDMX
  • Создать базу данных из модели
  • Используйте новый model.edmx.sql для повторного созданиябаза данных
  • заполнить базу данных своими данными
  • повтори попытку
0 голосов
/ 13 января 2012

Убедитесь, что ваша модель сущности синхронизирована с моделью базы данных.Обновляйте свою модель сущностей каждый раз, когда вы вносите изменения в базу данных (обновляете модель из базы данных), в противном случае вы можете получить неожиданные исключения.

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