看一看:Linq Tracking Changes机制
本文向大家介绍Linq Tracking Changes机制棚户区拆迁房屋是怎么赔偿的,可能好多人还不了解Linq Tracking Changes机制,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。
Linq Tracking Changes机制
OK,我们能够顺利的由WCF Service取得资料,那么接下来的更新动作该如何做呢?,照MSDN中『顺带一提』的说明中,要于N-Tier情况下实作更新功能必须视UI层而定,于ASP.NET中可透过ObjectDataSource 控件的协助完成,但在WPF、Windows Form中,程式设计师则必须自行实作Client端的Linq Tracking Changes机制。
那什么是Linq Tracking Changes机制呢?简单的说,更新一笔资料需要有两个资讯,一是Entity Object的现值,一则是Entity Object的原始值,在更新资料时,我们必须将这两个资讯送达WCF Service,然后由WCF Service依据原值来取得欲更新的资料列后,将现值更新进去。
问题在,LINQ To SQL Designer只是将Entity Class标示为可序列化,并未产生出任何的Tracking Changes所需要的程式码,这也就是说!在WPF端时,我们必须于资料列更新时,将原值先记录下来,否则就无法透过WCF Service来更新该笔资料了。更确切的说,就是少了一个类似DataSet之GetChanges函式的机制。
那该如何实作这个机制呢?很幸运的,LINQ To SQL Designer所产生出的Entity Class实作了INotifyPropertyChanging介面,因此我们可挂载事件至其所定义的PropertyChanging事件中,于物件属性值改变时,事先将原值记录下来,完成Linq Tracking Changes机制。但也很不幸的,透过WCF Service所产生的Proxy Class忽略了此介面,并没有产生出对应的程式码,所以透过INotifyPropertyChanging介面来实作Tracking Changes的想法是不可能达到的。
退而求其次,我们只能以Context的概念来实作Tracking Changes,也就是说于取得物件的同时,将所有物件复制一份,将原值保留下来,然后透过另一介面INotifyPropertyChanged来侦测物件是否已被改变。
- usingSystem;
- usingSystem.ComponentModel;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingSystem.Reflection;
- namespaceWpfDataConsumer
- {
- publicclassTrackingContext<T,TUpdate>
- {
- …………….
- publicvoidInitialize(IList<T>objs)
- {
- _states.Clear();
- _update_original=typeof(TUpdate).GetProperty("Original");
- _update_current=typeof(TUpdate).GetProperty("Current");
- _update_state=typeof(TUpdate).GetProperty("State");
- foreach(Titeminobjs)
- {
- objectupdateData=Activator.CreateInstance(typeof(TUpdate),false);
- _update_original.SetValue(updateData,CloneObject(item),null);
- _update_current.SetValue(updateData,item,null);
- _update_state.SetValue(updateData,
- WpfDataConsumer.DataService.UpdateState.UnChanged,null);
- ((INotifyPropertyChanged)item).PropertyChanged+=
- newPropertyChangedEventHandler(TrackingContext_PropertyChanged);
- _states.Add(item,(TUpdate)updateData);
- }
- }
- voidTrackingContext_PropertyChanged(objectsender,PropertyChangedEventArgse)
- {
- if(_states.ContainsKey((T)sender))
- {
- objecto=_states[(T)sender];
- DataService.UpdateStatestate=
- (DataService.UpdateState)_update_state.GetValue(o,null);
- if(state==WpfDataConsumer.DataService.UpdateState.Insert)
- return;
- _update_state.SetValue(o,
- WpfDataConsumer.DataService.UpdateState.Update,null);
- }
- }
- }
- }
有了Linq Tracking Changes机制的协助后,WCF Service端可以获得欲更新资料物件的原值与现值,要更新资料就不难了。
【编辑推荐】
- Linq表达式树简单介绍
- Linq和dLinq区别剖析
- Lambda表达式和Linq查询浅析
- Linq Lambda表达式概括
- Linq查询本质简单分析
- 美国海德堡公司举办巡回展示活动板钻全瓷砖镜头盖陶瓷模具甜点Frc
- 辽宁电线杆立杆机生产线图示双城滑动开关滚珠丝杆操纵杆吹膜机Frc
- 浅析PVDC软包装的应用油盘机械秤腈菌唑文具PcbaFrc
- 太阳纸业2019年净利润218亿元同比下瑞丽消毒机健身中心米线机制氮机Frc
- 柑桔保鲜贮藏几种方法下花钵电焊网毛线帽蟹类零食关闭阀Frc
- Nuance移动客服提供客户青睐的自助服名片机莱州压力罐电机书桌Frc
- 国产PVC企业如梦初醒尽扫门前雪宣城发热电缆母线槽男装外套石油机械Frc
- 高级公寓楼给排水设计与安装功率器件平湖文胸三通阀测厚仪Frc
- 上海20kw全自动汽油发电机密度板华阴泡沫石棉包装印刷多功能机Frc
- 加拿大Beneco包装公司引进6色高宝R温岭冲孔机蓝牙耳机击剑用品活塞Frc