Как удалить дерево в C # Entity Framework Core? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть Category class, который имеет List<Category>. Таким образом, создается древовидная структура типа Category, затем несколько подкатегорий, затем снова несколько подкатегорий под ней и т. Д.

Я хочу удалить все это дерево, я реализовал описанный ниже метод, но он не работает должным образом.

public async Task DeleteCategoryById(int Id)
{
    CategoryDto category = new CategoryDto();
    var details = _categoryRepository.GetAll().Where(x => x.Id == Id);

if (details == null)
{
 return;  
}
var children = (_categoryRepository.GetAll().Where(x => x.ParentId == Id));
int childCount = children.Count();

if (childCount != 0 )
{
    category.Category = ObjectMapper.Map<List<CategoryDto>>(children);
}

if (category.Category == null)
{
   await _categoryRepository.DeleteAsync(x => x.Id == Id);
}
else
{
    for (var i = 0; i < childCount; i++)
    {
      await  DeleteCategoryById(category.Category[i].Id);
    }
}
}

public class Category
{
    public int Id { get; set; }
    public string CategoryName { get; set; }
    public bool IsLast { get; set; } = true;
    public int ParentId { get; set; }
    public List<Category> Category { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Спасибо, @Ivan Stoev за ваши предложения, у меня это сработало.

Перемещение await _categoryRepository.DeleteAsync(x => x.Id == Id); в конец метода (безоговорочно после удаления потомков).Я рекурсивно удалял только детей листа.

0 голосов
/ 16 мая 2018

1-й вариант: в вашем контекстном классе вы должны включить каскадное поведение при удалении:

Пример:

protected override void OnModelCreating(Modelbuilder modelBuilder)
{
    modelBuilder.Entity<Category>()
   .HasMany(c => c.Category)
   .WithOne(e => e.Category).
   .OnDelete(DeleteBehavior.Cascade );
}

OR

2-й вариант: сначала удалите childrem, а затем удалите основную категорию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...