针阀厂家
免费服务热线

Free service

hotline

010-00000000
针阀厂家
热门搜索:
成功案例
当前位置:首页 > 成功案例

看一看:Linq Tracking Changes机制

发布时间:2022-03-24 19:41:13 阅读: 来源:针阀厂家
Linq Tracking Changes机制 作者:佚名 2009-09-16 09:47:15 开发 后端 这里介绍什么是Linq Tracking Changes机制呢房屋被强拆后还能评估吗?简单的说,更新一笔资料需要有两个资讯,一是Entity Object的现值,一则是Entity Object的原始值。

本文向大家介绍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. usingSystem;
  2. usingSystem.ComponentModel;
  3. usingSystem.Collections.Generic;
  4. usingSystem.Linq;
  5. usingSystem.Text;
  6. usingSystem.Reflection;
  7. namespaceWpfDataConsumer
  8. {
  9. publicclassTrackingContext<T,TUpdate>
  10. {
  11. …………….
  12. publicvoidInitialize(IList<T>objs)
  13. {
  14. _states.Clear();
  15. _update_original=typeof(TUpdate).GetProperty("Original");
  16. _update_current=typeof(TUpdate).GetProperty("Current");
  17. _update_state=typeof(TUpdate).GetProperty("State");
  18. foreach(Titeminobjs)
  19. {
  20. objectupdateData=Activator.CreateInstance(typeof(TUpdate),false);
  21. _update_original.SetValue(updateData,CloneObject(item),null);
  22. _update_current.SetValue(updateData,item,null);
  23. _update_state.SetValue(updateData,
  24. WpfDataConsumer.DataService.UpdateState.UnChanged,null);
  25. ((INotifyPropertyChanged)item).PropertyChanged+=
  26. newPropertyChangedEventHandler(TrackingContext_PropertyChanged);
  27. _states.Add(item,(TUpdate)updateData);
  28. }
  29. }
  30. voidTrackingContext_PropertyChanged(objectsender,PropertyChangedEventArgse)
  31. {
  32. if(_states.ContainsKey((T)sender))
  33. {
  34. objecto=_states[(T)sender];
  35. DataService.UpdateStatestate=
  36. (DataService.UpdateState)_update_state.GetValue(o,null);
  37. if(state==WpfDataConsumer.DataService.UpdateState.Insert)
  38. return;
  39. _update_state.SetValue(o,
  40. WpfDataConsumer.DataService.UpdateState.Update,null);
  41. }
  42. }
  43. }
  44. }

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

【编辑推荐】

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