Linq级联删除 CascadingDeleteOnSubmit

本文介绍了一种使用递归方法在外键关联的数据表中进行级联删除的方法。通过查找带有AssociationAttribute标记的属性来识别外键关联,并递归地删除所有相关记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数

用递归获取外键关联记录,从最外面一直删到最里面(本身)。

获取外键关联记录的办法是找有AssociationAttribute属性的Property,然后遍历,删除。

1 public static void CascadingDeleteOnSubmit(this DataContext context, object entity)
2 {
3 var entityType = entity.GetType();
4 var entityProperties = entityType.GetProperties();
5 //查找是否有“AssociationAttribute”标记的属性
6 //(Linq中有“AssociationAttribute”标记的属性代表外表)
7   var associationProperties = entityProperties.Where(
8 c => c.GetCustomAttributes(true).Any(
9 attrbute => attrbute.GetType().Name == "AssociationAttribute")
10 & c.PropertyType.IsGenericType);//该属性必需是泛型
11 //其他表有外键关联的记录
12   foreach (var associationProperty in associationProperties)
13 {
14 //获取Property值
15   object propertyValue = associationProperty.GetValue(entity, null);
16 //Property是EntitySet`1类型的值,如EntitySet<DataSetStructure>,
17 //而EntitySet`1有IEnumerable接口
18   IEnumerable enumerable = (IEnumerable)propertyValue;
19 foreach (object o in enumerable)
20 {
21 //递归
22   CascadingDeleteOnSubmit(context, o);
23 }
24 }
25
26 try
27 {
28 //删除没外键关联的记录
29 context.GetTable(entity.GetType()).DeleteOnSubmit(entity);
30 }
31 catch (Exception ex)
32 {
33 throw ex;
34 }
35 }

用法:

1 public virtual string CascadingDelete(string id)
2 {
3 TDataContext context = new TDataContext();
4 TEntity t = context.GetTable<TEntity>().Where(c => c.ID.Equals( id)).First();
5 context.CascadingDeleteOnSubmit(t);
6 context.SubmitChanges();
7 return Constances.ErrorMassage.SUCCEED;
8 }

转载于:https://www.cnblogs.com/zwgg/archive/2011/03/15/1984568.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值