У меня есть приложение WPF с кодом EF6, сначала с подключенным сценарием, и у меня проблема с удалением дерева в моей базе данных: это занимает слишком много времени.
По сути, вот мой класс Tree:
public class Tree
{
public int Id { get; set; }
public ObservableCollection<Tree> Children { get; set; }
public Tree Parent { get; set; }
public Tree()
{
Children = new ObservableCollection<Tree>();
}
}
А вот моя функция в Dal , с db , то есть dbContext и с dbSet named TreeElements
public async Task<bool> RemoveTreeElementInCascade(Tree tr)
{
try
{
List<Tree> tmp = tr.Children.ToList();
db.TreeElements.Remove(tr);
List<Task> tasks = new List<Task>();
foreach (Tree t in tmp)
{
tasks.Add(RemoveTreeElementInCascade(t));
}
Task.WaitAll(tasks.ToArray());
await db.SaveChangesAsync();
return true;
}
catch (Exception e)
{
return false;
}
}
И когда я вызываю эту функцию Tree, которая содержит около 500 элементов, это может занять около 3 минут.Я не знаю, что не так.Я думаю об удалении только одного и делать CascadeDelete, но я не знаю, как это сделать.Вот FluentAPI для дерева:
modelBuilder.Entity<Tree>()
.HasMany(t => t.Children)
.WithMany()
.Map(m =>
{
m.ToTable("TreeElementChildren");
m.MapLeftKey("TreeElementId");
m.MapRightKey("ChildrenId");
});
Может быть, я неправильно делаю функцию удаления, или, возможно, есть способ разрешить каскадное удаление в этом сценарии?