新聞中心
本文向大家介紹Linq Tracking Changes機制,可能好多人還不了解Linq Tracking Changes機制,沒有關系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。

創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的10年時間我們累計服務了上千家以及全國政企客戶,如成都服務器托管等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質量監(jiān)控加上過硬的技術實力獲得客戶的一致稱贊。
Linq Tracking Changes機制
OK,我們能夠順利的由WCF Service取得資料,那么接下來的更新動作該如何做呢?,照MSDN中『順帶一提』的說明中,要于N-Tier情況下實作更新功能必須視UI層而定,于ASP.NET中可透過ObjectDataSource 控件的協(xié)助完成,但在WPF、Windows Form中,程式設計師則必須自行實作Client端的Linq Tracking Changes機制。
那什么是Linq Tracking Changes機制呢?簡單的說,更新一筆資料需要有兩個資訊,一是Entity Object的現(xiàn)值,一則是Entity Object的原始值,在更新資料時,我們必須將這兩個資訊送達WCF Service,然后由WCF Service依據(jù)原值來取得欲更新的資料列后,將現(xiàn)值更新進去。
問題在,LINQ To SQL Designer只是將Entity Class標示為可序列化,并未產(chǎn)生出任何的Tracking Changes所需要的程式碼,這也就是說!在WPF端時,我們必須于資料列更新時,將原值先記錄下來,否則就無法透過WCF Service來更新該筆資料了。更確切的說,就是少了一個類似DataSet之GetChanges函式的機制。
那該如何實作這個機制呢?很幸運的,LINQ To SQL Designer所產(chǎn)生出的Entity Class實作了INotifyPropertyChanging介面,因此我們可掛載事件至其所定義的PropertyChanging事件中,于物件屬性值改變時,事先將原值記錄下來,完成Linq Tracking Changes機制。但也很不幸的,透過WCF Service所產(chǎn)生的Proxy Class忽略了此介面,并沒有產(chǎn)生出對應的程式碼,所以透過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機制的協(xié)助后,WCF Service端可以獲得欲更新資料物件的原值與現(xiàn)值,要更新資料就不難了。
本文題目:LinqTrackingChanges機制
新聞來源:http://fisionsoft.com.cn/article/ccdoggj.html


咨詢
建站咨詢
