代码改变世界

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标记,分别是ColumnAttributeAssociationAttribute,前者表示该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自动生成的对应数据表的数据类。