我一直在尋找的級聯刪除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();
}
}
}
非常感謝你,
荊您的解決方案
如何beforeDeleteCallback使用? – Flater
這是一個檢查點,我們用它來記錄被刪除實體的細節。你也可以將這個過程從回調中分解出來(我們沒有爲它使用它,但是我是這樣做的)。所以例如'helper.Delete(實體,O => {Console.WriteLine(○);返回true;});' –