首先我有一个带有EF6代码的WPF应用程序,并且连接了场景,但是在删除数据库中的树时遇到了问题:这花费了太多时间。
基本上,这是我的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 名为 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;
}
}
当我将此函数称为具有约500个元素的Tree时,可能需要3分钟。我不知道怎么了我虽然只打算删除一个,然后执行CascadeDelete,但是我不知道该怎么做。这是Tree的FluentAPI:
modelBuilder.Entity<Tree>()
.HasMany(t => t.Children)
.WithMany()
.Map(m =>
{
m.ToTable("TreeElementChildren");
m.MapLeftKey("TreeElementId");
m.MapRightKey("ChildrenId");
});
也许我的删除功能做错了,或者在这种情况下有一种方法可以允许级联删除?