本文向大家介绍Linq Tracking Changes机制,可能好多人还不了解Linq Tracking Changes机制,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的10年时间我们累计服务了上千家以及全国政企客户,如成都服务器托管等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称赞。
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来侦测物件是否已被改变。
- using System;
 - using System.ComponentModel;
 - using System.Collections.Generic;
 - using System.Linq;
 - using System.Text;
 - using System.Reflection;
 - namespace WpfDataConsumer
 - {
 - public class TrackingContext
 ,TUpdate> - {
 - …………….
 - public void Initialize(IList
 objs) - {
 - _states.Clear();
 - _update_original = typeof(TUpdate).GetProperty("Original");
 - _update_current = typeof(TUpdate).GetProperty("Current");
 - _update_state = typeof(TUpdate).GetProperty("State");
 - foreach (T item in objs)
 - {
 - object updateData = 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 +=
 - new PropertyChangedEventHandler(TrackingContext_PropertyChanged);
 - _states.Add(item, (TUpdate)updateData);
 - }
 - }
 - void TrackingContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
 - {
 - if (_states.ContainsKey((T)sender))
 - {
 - object o = _states[(T)sender];
 - DataService.UpdateState state =
 - (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端可以获得欲更新资料物件的原值与现值,要更新资料就不难了。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号