2013-10-13 55 views
0

我有OData服務(WCF數據服務5.6)使用EF和Oracle Data Provider for .Net。 當我跟蹤服務查詢到數據庫服務器時,我發現即使我只修改了1列,UPDATE包含了表中的所有列。例如 - 我可以有5列的表格,在客戶端修改1並調用SaveChanges()。 在服務器端,在oracle中我得到只更新修改的列

UPDATE COL1 = X,COL2 = X,COL3 = X,COL4 = x其中....

我讀了很多在互聯網這個問題,但仍沒有找到任何明確的解決方案。當然,我不是唯一一個有這個問題,但可能有人有想法如何 解決這個問題?

我看到EF6即將推出,WCF數據服務團隊發佈Alpha for EF6,但是,首先它仍然是阿爾法,而EF6是RC,其次,它有一些問題,第三 - 不能保證相同問題在新版本中不存在。

希望有人有正確的答案...

回答

1

好吧,看來我想至少有一種方式如何做到這一點。 在WCF服務,在ChangeInterceptor:

[ChangeInterceptor("Entity")] 
     public void OnChange(Entity item, UpdateOperations operations) 
     { 
      Dictionary<string, object> changes = new Dictionary<string, object>(); 
      foreach (String propName in this.CurrentDataSource.Entry(item).CurrentValues.PropertyNames) 
      { 
       if (this.CurrentDataSource.Entry(item).Property(propName).IsModified) 
        changes.Add(propName, this.CurrentDataSource.Entry(item).Property(propName).CurrentValue); 
      } 
      this.CurrentDataSource.Entry(item).State = System.Data.EntityState.Unchanged; 
      var arrayOfAllChangedProps = changes.Keys.ToArray(); 
      foreach(string prop in arrayOfAllChangedProps) 
       this.CurrentDataSource.Entry(item).Property(prop).CurrentValue = changes[prop]; 
      return; 
     } 

我們得到修改後的值,將其添加到字典中(可以是任何其他集合),然後復位標誌修改後的狀態。如果在此之前標誌被重置,那麼我們無法獲得更改。當標誌復位時,將當前值設置爲保存狀態,然後重置標誌進行修改。

經過這一切,我們將看到只有修改過的列在UPDATE語句中。

我真的不明白,爲什麼這不是默認行爲?爲什麼所有這些魔法都應該完成。另外,我不知道這是否是正確的方法。但至少這爲我工作。

0

它的工作原理,我今天剛剛生成使用EF5和DS5.6對測試數據集此SQL查詢:

exec sp_executesql N'update [dbo].[People] 
set [City] = @0 
where ([Id] = @1) 
',N'@0 nvarchar(max) ,@1 bigint',@0=N'Mashville',@1=1 

的OData查詢:http://localhost:50000/People(1L)

OData的有效載荷:{ "City": "Mashville" }

也許你忘記使用HTTP PATCH方法而不是PUT