专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » linq教程:Funny Linq Part4:通用的级联删除 »正文

linq教程:Funny Linq Part4:通用的级联删除

来源: 发布时间:星期三, 2008年9月10日 浏览:47次 评论:0
从父表中删除外键时也会删除子表中的行。如果在一个表的主键列上删除了一些行,那么在启用级联删除的情况下,将在相关表的任何外键列上删除相同信息。

/// <summary>
/// 级联删除(从父表中删除外键时也会删除子表中的行)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="TEntity"></param>
/// <returns></returns>
public static void CascadingDeletes<T>(T TEntity) where T : class // where T : INotifyPropertyChanging, INotifyPropertyChanged
{
var _type = TEntity.GetType();
var _prop = _type.GetProperties();
//查找是否有“AssociationAttribute”标记的属性(Linq中有“AssociationAttribute”标记的属性代表外表)
var _assolist = _prop.Where(
c => c.GetCustomAttributes(true).Any(
a => ((Attribute)a).GetType().Name == "AssociationAttribute") &
c.PropertyType.IsGenericType);//该属性必需是泛型
//其他表有外键关联的记录
if (_assolist.Count() > 0)
{
foreach (var _asso in _assolist)
{
var _items = _asso.GetValue(TEntity, null);
var _tItems = _items.GetType();
var _item = _tItems.GetProperty("Item");
var _tItem = _item.PropertyType;
var _countProp = _tItems.GetProperty("Count");//获取泛型中的属性“Count”
if (_countProp == null)
throw new Exception("Cannot find the property 'Count' in " + _items.ToString());
var _count = (int)_countProp.GetValue(_items, null);//获取关联记录的数量
for (int i = 0; i < _count; i++)
{
var _value = _item.GetValue(_items, new object[] { i });
CascadingDeletes(_value);//删除其他表有外键关联的记录
}
}
}
try
{
DeleteByName(TEntity);//删除没外键关联的记录
}
catch (Exception ex)
{
throw ex;
}
}


public static void DeleteByName<T>(T TEntity) where T : class
{
var type = TEntity.GetType();
var table = TableFactory.CreateTable(type );
table.DeleteOnSubmit(TEntity);
//Console.WriteLine("Delete:"+ TEntity.ToString());
}

public static class TableFactory
{
public static System.Data.Linq.Table<T> CreateTable<T>() where T : class
{
return Database.NWDB.GetTable<T>();
}

public static System.Data.Linq.ITable CreateTable (Type t)
{
return Database.NWDB.GetTable(t);
}
}


public static class Database
{
private static DLinq.NWDBDataContext _NWDB = null;

public static DLinq.NWDBDataContext NWDB
{
get
{
if (_NWDB == null)
_NWDB = new DLinq.NWDBDataContext();
return _NWDB;
}
}


}
注:DLinq.NWDBDataContext 就是对应的dbml文件的类名。
希望这篇文章能给学习Linq的人带来帮助,也随便学学Reflection~

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: