Linq, Update, 数据对象作参数
2010-11-24 17:13 Jeff Chow 阅读(463) 评论(0) 编辑 收藏 举报在使用Linq的时候,对于某一数据模型的插入或者删除操作,System.Data.Linq.Table<TEntity>类为我们提供了对应的函数:
public void InsertOnSubmit(TEntity entity);
public void DeleteOnSubmit(TEntity entity);
但是对于修改操作,MSDN上面的例子是逐个逐个属性去设置。既然插入和删除操作都是以TEntity的对象作为参数,那么在修改操作上,我自然也想这么做。先是Google了一下,没有找到满意的答案,不过自己有了一些想法,然后到CSDN上面发了个贴问人。解决方法就是,在Linq自动生成的的数据模型类中,它的Property主要有两种Attribute标记,分别是ColumnAttribute和AssociationAttribute,前者表示该Property是数据表里边的字段对应的值,后者表示该属性是与数据表外键相关联的数据。那么在Update操作中,我只需区分两者,把带有ColumnAttribute标记的Property的值进行复制即可。
用于复制属性的工具函数:
public static void CopyColumnAttributeProperty<T>(T tSource, T tDestination) where T : class { //获得所有property的信息。 PropertyInfo[] properties = tSource.GetType().GetProperties(); foreach (PropertyInfo p in properties) { if (p.GetCustomAttributes(false).Any(Attribute => Attribute is ColumnAttribute)) { //设置tDestination的属性值。 p.SetValue(tDestination, p.GetValue(tSource, null), null); } } }
Update方法:
public void Update(Tab_DeviceInfo deviceInfo) { GSMDataContext data = new GSMDataContext(); Tab_DeviceInfo destination = data.Tab_DeviceInfos.Single(device => device.DI_ID == deviceInfo.DI_ID); PropertyUtility.CopyColumnAttributeProperty(deviceInfo, destination); data.SubmitChanges(); }
还是以上一篇中提到的Device类作例子,Tab_DeviceInfo是Linq to Sql自动生成的对应数据表的数据类。