Простое каскадное удаление собственной таблицы ссылок с 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, который будет удалять все в таблице при обработке каскадных удалений?
- Тип текстовых данных не может быть выбран как DISTINCT, потому что он не сопоставим
- Создание универсального метода обновления структуры привязки сущностей для многих объектов ко многим
- Как подсчитать несколько отдельных столбцов в linq для sql?
- Выберите значения из одной таблицы на основе определенного значения другой таблицы Linq
- Как я могу сделать LINQ Select, который включает дочерний объект, такой как внешнее соединение 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; } } }
- Поворот данных из разных таблиц
- Извлечь сообщения SQL 'print' из LINQ ExecuteMethodCall
- Вычисление ежемесячных отчетов или статистических данных - MVC Entity Framework LinQ
- максимальная запись даты в LINQ
- Выберите одну строку за определенное время
- Добавление новых лямбда-выражений с использованием дерева выражений
- Entity Framework генерирует неэффективный SQL для постраничного запроса
- Сколько издержек производительности базы данных при использовании LINQ?
Хорошо, кофе пинал, это работает:
Добавьте в класс 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(); }