Linq Tracking Changes机制
创始人
2024-06-07 04:21:15
0

本文向大家介绍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来侦测物件是否已被改变。

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6. using System.Reflection;  
  7.    
  8. namespace WpfDataConsumer  
  9. {  
  10. public class TrackingContext,TUpdate> 
  11. {  
  12. …………….  
  13. public void Initialize(IList objs)  
  14. {  
  15. _states.Clear();  
  16. _update_original = typeof(TUpdate).GetProperty("Original");  
  17. _update_current = typeof(TUpdate).GetProperty("Current");  
  18. _update_state = typeof(TUpdate).GetProperty("State");  
  19. foreach (T item in objs)  
  20. {  
  21. object updateData = Activator.CreateInstance(typeof(TUpdate), false);  
  22. _update_original.SetValue(updateData, CloneObject(item),null);  
  23. _update_current.SetValue(updateData, item, null);  
  24. _update_state.SetValue(updateData,  
  25. WpfDataConsumer.DataService.UpdateState.UnChanged, null);  
  26. ((INotifyPropertyChanged)item).PropertyChanged +=  
  27. new PropertyChangedEventHandler(TrackingContext_PropertyChanged);  
  28. _states.Add(item, (TUpdate)updateData);  
  29. }  
  30. }  
  31.    
  32. void TrackingContext_PropertyChanged(object sender, PropertyChangedEventArgs e)  
  33. {  
  34. if (_states.ContainsKey((T)sender))  
  35. {  
  36. object o = _states[(T)sender];  
  37. DataService.UpdateState state =  
  38. (DataService.UpdateState)_update_state.GetValue(o, null);  
  39. if (state == WpfDataConsumer.DataService.UpdateState.Insert)  
  40. return;  
  41. _update_state.SetValue(o,  
  42. WpfDataConsumer.DataService.UpdateState.Update, null);  
  43. }  
  44. }  
  45. }  

有了Linq Tracking Changes机制的协助后,WCF Service端可以获得欲更新资料物件的原值与现值,要更新资料就不难了。

【编辑推荐】

  1. Linq表达式树简单介绍
  2. Linq和dLinq区别剖析
  3. Lambda表达式和Linq查询浅析
  4. Linq Lambda表达式概括
  5. Linq查询本质简单分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...