Простое каскадное удаление собственной таблицы ссылок с LINQ to SQL

Оператор DELETE противоречил ограничению SAME TABLE REFERENCE "FK_AuthCategories_Parent". Конфликт произошел в базе данных «MyDB», таблице «dbo.AuthCategories», в столбце «ParentID».

Если я попытаюсь удалить все в таблице, в которой есть FQ для ParentID с саморегуляцией, я получаю вышеописанную ошибку, прежде чем мне нужно сначала удалить детей (т. Е. Пытается удалить родительский элемент с дочерними элементами, который разбивает FK).

var dc = from c in db.AuthCategories select c; db.AuthCategories.DeleteAllOnSubmit(dc); db.SubmitChanges(); 

Есть ли простой запрос LINQ to SQL, который будет удалять все в таблице при обработке каскадных удалений?

  • Не хотите использовать SQL-серверное решение, такое как триггеры или ON DELETE CASCADE
  • Необходимо использовать LINQ to SQL, а не EF
  • Хотелось бы, чтобы это было как можно проще, однострочный, если возможно

Вот структура таблицы:

 [Table(Name = "AuthCategories")] public class AuthCategory { [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int ID { get; set; } [Column] public string Name { get; set; } [Column] private int? ParentID { get; set; } private EntityRef<AuthCategory> parent; [Association(IsForeignKey = true, ThisKey = "ParentID")] public AuthCategory Parent { get { return parent.Entity; } set { parent.Entity = value; } } } 

Хорошо, кофе пинал, это работает:

Добавьте в класс IE IEnumerable:

 private EntitySet<AuthCategory> children = new EntitySet<AuthCategory>(); [Association(Storage = "children", OtherKey = "ParentID")] public IEnumerable<AuthCategory> AuthCatChildren { get { return children; } } public IEnumerable<AuthCategory> Children { get { return (from x in AuthCatChildren select x).AsEnumerable(); } } 

И теперь вы можете сначала удалить детей через цикл while:

 // Loop, Deleting all rows with no children (which would delete childless parents and nested grandchild/children) int loop = 1; while (loop > 0) { var dbList = from c in db.AuthCategories.ToList() where c.Children.Count() == 0 select c; loop = dbList.Count(); db.AuthCategories.DeleteAllOnSubmit(dbList); db.SubmitChanges(); } 
  • C # LINQ string.startsWith не игнорирует специальные буквы
  • Типы данных, поддерживаемые в visual studio 2008
  • EF LEFT OUTER JOIN вместо INNER JOIN в отношениях от одного до многих
  • Как ссылаться на поле в LINQ, которое называется с использованием зарезервированного слова?
  • Получить первые 5 значений с помощью лямбда-запроса
  • Сколько накладных расходов «Update Check» имеет для LINQ UPDATES
  • Как получить изображения из базы данных SQL Server в форму WPF? (LINQ, привязка данных, SQL)
  • Как Ef генерирует Tsql
  • ASP.net Получение Max Дата базы данных Столбец столбца Как избежать нулевого столбца даты C # Мой код Прикрепленный файл
  • Наследование внутри сформированных классов LINQ?
  • LINQ: Есть ли способ объединить эти запросы в один?
  • Давайте будем гением компьютера.