Удалить дерево в базе данных - PullRequest
2 голосов
/ 10 июля 2019

У меня есть приложение 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");
                });

Может быть, я неправильно делаю функцию удаления, или, возможно, есть способ разрешить каскадное удаление в этом сценарии?

...