2012-08-09 26 views
0

我正在使用Azure表存儲,並且有關如何使用實體的空值和默認值的問題。Azure表存儲中屬性的默認值

具體來說,我有一個類延伸TableServiceEntity。通過構建下列實體

public class MyEntity: TableServiceEntry 
{ 
    public MyEntity() : MyEntity("invalid", "invalid") {} 
    public MyEntity(string f1, string f2) 
    { 
     Field1 = f1; 
     Field2 = f2; 
    } 

    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

我本地測試這個類(在仿真器):該類的默認構造各種性質,像這樣設置缺省值

MyEntity e = new MyEntity("hello", null); 

我上傳的實體然後在本地檢索它,並且兩個字段分別按預期設置爲「hello」和null。

但是,當我將相同的實體上傳到Azure雲時,我收到的回覆分別是兩個屬性的「hello」和「invalid」。

我的代碼,節省了實體低於:

public class MyTable : TableServiceContext 
{ 
    ... 
    public void AddEntry(MyEntity e) 
    { 
     this.AddObject("MyTable", e); 
     this.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 
    } 
} 

我能夠通過將默認構造函數沒有參數來解決這個問題,但是現在我覺得我有多麼表存儲工作的根本誤解。如果爲TableServiceEntry的屬性指定默認值,那麼這些默認值是否成爲雲中表中每行的默認值,而不是模擬器中的默認值(即雲對比SQL Express)?如果是這樣,爲什麼我無法用雲中的null覆蓋這些默認值?是否有任何文檔解釋了默認的構造函數和null在Azure表存儲中的工作方式?

回答

1

是的,表格存儲在模擬器和雲中的行爲方式有所不同。在SQL服務器中實現的模擬器會返回爲表定義的所有列,即使未針對行定義,無論列值(空值/非空值)如何。在雲中,設置爲null的屬性既不存儲也不在REST調用中返回。

一個快速解決方法是檢查屬性集中的null,並且只有在傳入的值不爲null時才更改該屬性。

+0

只是爲了解釋一種不同的方式,發生的情況是null沒有被存儲。在檢索時,類正在初始化其自身的值爲「無效」,然後存儲庫將使用從存儲返回的值覆蓋字段。因爲Field2沒有任何價值(甚至沒有空值),所以Field2沒有被觸及並且仍然包含「無效」。 – smarx 2012-08-10 02:37:25

+0

我觀察到的行爲正是@smarx和@Lucifure所描述的。似乎有兩件重要的事情要做。 (1)不存儲/返回'null'。 (2)從Azure表中檢索實體時的控制流程是調用默認構造函數,然後填充表中的任何(現有)值。多謝你們! – msplants 2012-08-10 23:45:50

0

Devstorage和實際存儲在某些情況下的行爲不同,但我從來沒有見過它們以不同方式處理NULL值。而且我從來沒有看到它會將值從NULL更改爲「invalid」,正如您似乎暗示的那樣。你確定你沒有意外地將錯誤的值上傳到雲嗎?您可能需要重試,並使用Fiddler查看實際的請求和響應值。