2011-06-30 96 views
1

我一直在尋找的級聯刪除LINQ從C#到SQL中的通用的解決方案,但我無法找到任何呢。LINQ到SQL級聯刪除與反思

所以我想出了我自己的解決方案,它處理一對多的關係

它不會刪除實體的一般方式,但一些邊緣情況需要它。所以在進入生產環境之前,我想知道你對此有何看法?

看來工作,但什麼是利弊,它可能會失敗?請注意,它只應該遍歷關係樹的缺點。

public class CascadingDeleteHelper 
{ 
     public void Delete(object entity, Func<object, bool> beforeDeleteCallback) 
     { 
      if (!(entity is BusinessEntity)) 
      { 
       throw new ArgumentException("Argument is not a valid BusinessEntity"); 
      } 

      if (beforeDeleteCallback == null || beforeDeleteCallback(entity)) 
      { 
       Type currentType = entity.GetType(); 
       foreach (var property in currentType.GetProperties()) 
       { 
        var attribute = property 
         .GetCustomAttributes(true) 
         .Where(a => a is AssociationAttribute) 
         .FirstOrDefault(); 

        if (attribute != null) 
        { 
         AssociationAttribute assoc = attribute as AssociationAttribute; 

         if (!assoc.IsForeignKey) 
         { 
          var propertyValue = property.GetValue(entity, null); 
          if (propertyValue != null && propertyValue is IEnumerable) 
          { 
           IEnumerable relations = propertyValue as IEnumerable; 
           List<object> relatedEntities = new List<object>(); 

           foreach (var relation in relations) 
           { 
            relatedEntities.Add(relation); 
           } 

           relatedEntities.ForEach(e => Delete(e, beforeDeleteCallback)); 
          } 
         } 
        } 
       } 

       SingletonDataContext.DataContext.GetTable(currentType).DeleteOnSubmit(entity); 
       SingletonDataContext.DataContext.SubmitChanges(); 
      } 
     } 
    } 

非常感謝你,

荊您的解決方案

+0

如何beforeDeleteCallback使用? – Flater

+0

這是一個檢查點,我們用它來記錄被刪除實體的細節。你也可以將這個過程從回調中分解出來(我們沒有爲它使用它,但是我是這樣做的)。所以例如'helper.Delete(實體,O => {Console.WriteLine(○);返回true;});' –

回答

0

優點:

  • 它並不需要在架構更新數據庫的變化這是通用

缺點:

  • 易錯(多個自定義代碼)
  • 性能是(很可能)不是最佳的

有一種較不復雜的,但更多的維護重溶液,將其加入ON CASCADE DELETE規則到您的數據庫。

+0

可惜的是,ON CASCADE DELETE不是現在的選項。一個命令行維護系統將使用它(管理工具,手動啓動,很少),主要業務應用程序(sp + sl + wcf)不會,所以我認爲性能是可以接受的。你做? –