2014-03-24 66 views
0

我正在使用WCF數據服務(現在5.6),並且由於枚舉不支持(和其他原因),我有一些額外的屬性添加到我打算刪除的客戶端類在http://blogs.msdn.com/b/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data-services-client-library.aspxWCF數據服務SaveChanges沒有觸發WritingEntity事件

使用下面的例子中WritingEntity事件的SaveChanges在我的構造高度重視該事件,但我發現,有時候事件火災等倍(更多)它沒有。

public MyDataContext(System.Uri serviceRoot, bool ignoreProperties) 
    : this(serviceRoot) 
{ 
    if (ignoreProperties) 
     this.WritingEntity += EdiContext_WritingEntity; 
    this.SendingRequest2+=OnSendingRequest; 
} 

保存更改

db.AttachTo("Maps", map, "*"); 
db.UpdateObject(map); 
ProcessMapCoordinates(db, map); 
ProcessModifiers(map, db); 
db.SaveChanges(); 

的SendingRequest2事件不火,我用它來一些頭信息附加到請求,以支持多種數據

private void OnSendingRequest(object sender, SendingRequest2EventArgs e) 
{ 
    e.RequestMessage.SetHeader("profile", ClientSettings.Instance.Profile); 
} 

有誰知道WriteEntity事件在什麼情況下不會觸發?

是否有另一種方法來防止部分類的擴展屬性被序列化?

謝謝

回答

0

看來這是由於在客戶端部分類使用公共枚舉引起的。一旦我將枚舉的訪問修飾符改爲內部問題就消失了。

在這個過程中我學會了控制哪些屬性進行序列化,通過掛鉤到RequestPipeline事件的更好的方法:

if (ignoreProperties) 
{ 
    this.Configurations.RequestPipeline.OnEntryStarting((a => 
    { 
     entityType = Type.GetType(a.Entry.TypeName); 
     if (entityType != null) 
     { 
      var props = 
       entityType.GetProperties() 
        .Where(
         property => 
          property.GetCustomAttributes(typeof (DoNotSerializeAttribute), false).Length > 0) 
        .Select(p => p.Name) 
        .ToArray(); 
      a.Entry.RemoveProperties(props); 
     } 
    })); 
}