1

我需要登錄到客戶端上發生到數據庫表中的實體所做的更改。但是,當我進行更改並檢查ChangeTracker屬性時,它聲稱沒有發生任何更改。如何使用WCF Ria Services跟蹤實體更改?

[服務]

private static readonly ISomeDao someDao = DataAccess.SomeDao; 
    [Query] 
    public List<SomeEntity> GetSomeEntites(int someId) 
    { 
     var entities = someDao.GetSomeEntites(someId); 
     entities.ForEach(e => e.StartTracking()); 
     return entities; 
    } 

    [Update] 
    public void UpdateSomeEntity(SomeEntity entity) 
    { 
     // inspect entity.ChangeTracker.OriginalValues.... nothing 
     entity.StopTracking(); 
     // inspect entity.ChangeTracker.OriginalValues.... nothing 
     ... 
     // Update log table 
    } 

[客戶]

public EntitySet<SomeEntity> SomeEntities 
    { 
     get { return _someEntity; } 
     set 
     { 
      if (_someEntity!= value) 
      { 
       _someEntity= value; 
       OnPropertyChanged("SomeEntities"); 
      } 
     } 
    } 

所以,如果,自跟蹤實體和WCF RIA Services無法生活在一起(這是我我懷疑),一條軌跡如何變化?

+0

你看了我的答案嗎?還有其他問題嗎?祝你好運! – 2011-06-16 08:07:55

回答

1

不要用RIA服務工作,但單獨與WCF(不知道如果它使太大的區別...)。首先,你不必執行命令(服務器端),以StartTracking這是通過WCF與反序列化自動完成的實體。

[OnDeserialized] 
public void OnDeserializedMethod(StreamingContext context) 
{ 
    IsDeserializing = false; 
    ChangeTracker.ChangeTrackingEnabled = true; 
} 

第二我知道的是,只有在更改時記錄SELF跟蹤實體的主鍵和外鍵屬性。對於存在於實體環境中的NORMAL實體,情況並非如此(然後記錄所有更改)。

如果你把在自跟蹤實體仔細一看,你可能會看到這樣的事情:

[DataMember] 
    public string Plaats 
    { 
     get { return _plaats; } 
     set 
     { 
      if (_plaats != value) 
      { 
       _plaats = value; 
       OnPropertyChanged("Plaats"); 
      } 
     } 
    } 
    private string _plaats; 

    [DataMember] 
    public int LandID 
    { 
     get { return _landID; } 
     set 
     { 
      if (_landID != value) 
      { 
       ChangeTracker.RecordOriginalValue("LandID", _landID); 
       if (!IsDeserializing) 
       { 
        if (Land != null && Land.ID != value) 
        { 
         Land = null; 
        } 
       } 
       _landID = value; 
       OnPropertyChanged("LandID"); 
      } 
     } 
    } 
    private int _landID; 

你看到區別?簡單的屬性Plaats和外鍵屬性LandID之間?這是該行`ChangeTracker.RecordOriginalValue( 「LandID」,_landID);

對於簡單的屬性這些變化並不被記錄(屬性themseklves被場外的改變,使EF方面知道如何ApplyChanges並更新數據庫)。

可能的想法可能是:

  1. 要自定義T4模板來記錄原始值的每個屬性
  2. 從一個基類,你可以放下一些框架,通過記錄原始值獲得的所有實體響應的PropertyChanged事件
  3. 當更新的entites,首先得到來自數據庫的初始值和跟蹤更改

希望這可以幫助!