Я хочу удалить 2 набора данных в базе данных, используя EF Core.
Все коды являются гипотетическими.
Модели данных:
class Parent
{
public int Id { get; set; }
}
class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
public virtual Parent Parent { get; set; }
public bool Flag { get; set; }
}
Давайте предположим, что я хочу удалить все записи [Child] с (ParentId = 100) и (flag = false), после этого, если (child.ParentId = 100) .length = 0, затем удалить и самого родителя.
Итак, вот класс обслуживания:
class Service
{
public void Command(int parentId)
{
Parent parent = GetParent(parentId);
List<Child> children = GetChildren(parent);
List<Child> toDelete = children.Where(x => !x.Flag).ToList();
foreach(var child in toDelete)
{
var entry = DbContext.Entry(child);
entry.State = EntityState.Deleted;
}
List<Child> remainChildren = children.Where(x => x.Flag).ToList();
if (!remainChildren.Any())
{
var entry = DbContext.Entry(parent );
entry.State = EntityState.Deleted;
}
SaveChanges();
}
}
У меня есть несколько сценариев, которые вызывают метод Service.Command.
Поскольку я вызываю SaveChanges()
только один раз, я предполагаю, что все операции удаления будут выполнены в одной транзакции, и, конечно, они будут в следующем порядке:
- Удалить дочерние записи
- Удалить родителя
но EF отправляет запросы к базе данных следующим образом:
- Удалить родителя
- Удалить дочерние записи
Очевидно, это вызовет исключение ForeignKey.
Есть ли способ заставить EF Core выполнять запросы для того, чтобы я написал код?