Я искал общее решение для каскадного удаления в 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();
}
}
}
Большое спасибо,
негра