2014-10-09 56 views
0

我的要求是提供一種通用的方法來確保數據庫中不存在前導/尾隨空格。我們的架構是 WCF->商業邏輯Managers->通用Repository->實體框架5.0 - > DBWCF服務中的反序列化中的修剪空間

現在我有2種方法可以做到這

  1. 做它在通用信息庫(但在這裏我會必須在整個對象圖中搜索字符串屬性並更改該值)
  2. 在WCF管道反序列化時執行此操作(但在此可能需要將我的自定義序列化程序,我不想這樣做所有我想要的是序列化期間可以查詢屬性類型並更改其值的事件)

我贊成方法2,但尋找最簡單的方法來做到這一點,而無需更改整個序列化程序。有沒有一種方法可以在不使用自定義序列化器的情況下更改。目前我們正在使用XmlSerializer。

尋找下輸入(2)

  1. 哪一種方法是在性能上
  2. 更好,我怎麼能把我的現有串行化過程中WCF管道的小方法。

感謝, 阿維

+0

「我的要求是把一個通用的方法,以確保沒有前/後間隔都存儲在數據庫中」在什麼水平是您的要求?這是否是一項運輸要求? – Aron 2014-10-09 09:25:19

+0

這是一個持久性需求,消息已經到達最後一層,現在需要持久化。我希望在XML被反序列化時解決這個問題,這樣我就不必再次使用反射來查詢類型及其值。 – asolvent 2014-10-09 09:38:44

+1

這是一個修辭問題。我知道我的問題的答案。我的觀點是「最不理想的原則」。至於你對反思的關注。你的ORM已經有了關於實體類型的元數據(它知道所有的屬性,以及哪些是字符串)。實現這個需求的代碼距離實際的層越遠......你越「驚訝」,越有可能某些中間代碼會爲你提供幫助。 – Aron 2014-10-09 09:44:46

回答

0

您的代碼應該在數據層,而不是序列化層的工作,因爲這是要求源自哪裏。

至於實施,你有兩個選擇。

您可以使用DbChangeTracker或者您可以使用IDbCommandInterceptor(EF6中的新功能)來更改EF上下文的行爲。

下面是如何您可以輕鬆地改變跟蹤做到這一點

public class FooContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     var items = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
     foreach(var item in items) 
     foreach(var property in item.PropertyNames) 
     { 
      var propValue = item[property] as string; 
      if(propValue != null) 
      { 
       item[property] = propValue.Trim(); 
      } 
     } 
     return base.SaveChanges(); 
    } 
}