2015-08-08 53 views
0

刪除我有一個CategoryEF級聯在單臺

public class Category : BaseEntity { 
    //[Key] 
    //[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    //public int Id { get; private set; } 
    public string Name { get; set; } 
    public int Owner { get; set; } 
    public int? PId { get; private set; } 
    [ForeignKey("PId")] 
    public Category Parent { get; set; } 
    public ICollection<Category> Subcategories { get; set; } 
} 

一個類別可以有一個Parent類別可選,並有很多子類,就像一棵樹。

刪除類別時,我想刪除級聯中的子類別。我試過了下面的代碼:

public CategoryMapping() { 
     HasKey(t => t.Oid); 
     Property(t => t.Oid).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(t => t.CreatedDate).IsRequired(); 
     Property(t => t.Uid).IsRequired().HasMaxLength(50); 
     Property(t => t.Name).IsRequired(); 

     ToTable("W_CATEGORY"); 

     this.HasMany(wi => wi.Subcategories).WithOptional(wi => wi.Parent).WillCascadeOnDelete(true); 

它不能正常工作。誰能幫我?謝謝。

回答

1

SQL Server不允許您在自引用關係上設置級聯刪除,存在循環邏輯問題的潛在可能。這樣你可以刪除類別及其子:

public void Remove(int id) 
{ 
    var selectedCategory = _category.Find(id); 
    _category.Where(x => x.ParentId == id).Load(); 
    _category.Remove(selectedCategory); 
} 

或者你可以用這樣的方式:

private Stack<Category> GetChildsAndRoot(Category category) 
{ 
      var stack = new Stack<Category>(); 
      var queue = new Queue<Category>(); 
      stack.Push(category); 
      queue.Enqueue(category); 
      while (queue.Any()) 
      { 
       var currCategory = queue.Dequeue(); 
       foreach (var child in currCategory.Childs) 
       { 
        queue.Enqueue(child); 
        stack.Push(child); 
       } 
      } 

      return stack; 
} 
var category = _categoryRepository.GetByID(id); 

var nodes = GetChildsAndRoot(category); 
while (nodes.Any()) 
{ 
     _categoryRepository.Delete(nodes.Pop()); 
} 

_unitOfWork.SaveChanges(); 
+0

@Afifi,非常感謝你。 – sendreams