我正在使用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表存儲中的工作方式?
只是爲了解釋一種不同的方式,發生的情況是null沒有被存儲。在檢索時,類正在初始化其自身的值爲「無效」,然後存儲庫將使用從存儲返回的值覆蓋字段。因爲Field2沒有任何價值(甚至沒有空值),所以Field2沒有被觸及並且仍然包含「無效」。 – smarx 2012-08-10 02:37:25
我觀察到的行爲正是@smarx和@Lucifure所描述的。似乎有兩件重要的事情要做。 (1)不存儲/返回'null'。 (2)從Azure表中檢索實體時的控制流程是調用默認構造函數,然後填充表中的任何(現有)值。多謝你們! – msplants 2012-08-10 23:45:50