Linq to SQL каскадное удаление с отражением - PullRequest
1 голос
/ 30 июня 2011

Я искал общее решение для каскадного удаления в linq to sql из c #, но пока не смог найти.

Итак, я придумал собственное решение, которое обрабатывает отношения один ко многим .

Это не будет общим способом удаления сущностей, но некоторые крайние случаи требуют этого. Поэтому, прежде чем перейти к производственной среде, я хотел бы знать, что вы думаете об этом?

Кажется, работает, но каковы плюсы и минусы, где он может потерпеть неудачу? Обратите внимание, что он должен проходить только по нижней стороне дерева отношений.

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();
            }
        }
    }

Большое спасибо,

негра

1 Ответ

0 голосов
/ 30 июня 2011

Плюсы вашего решения:

  • Это универсально
  • Не требует изменений базы данных при обновлении схемы

Минусы:

  • Склонность к ошибкам (более нестандартный код)
  • Производительность (скорее всего) не оптимальна

Существует менее сложное, но более сложное решение, которое требует добавления ON CASCADE DELETE правил в вашу базу данных.

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