2015-05-18 34 views
2

保存所有這是相同的,我計劃在Azure Table中存儲(ATS)保存實體:Azure的表存儲不以實體定義

public class CarEntity : TableEntity 
{ 

    public CarEntity(string objPartitionKey, string objRowKey) 
    { 
     this.PartitionKey = objPartitionKey; 
     this.RowKey = objRowKey; 
    } 

    public string TableName 
    { 
     get { return "EntityTableName"; } 
    } 

    public string Property1 { get; set; } 
    // and this goes on 
    public string Property60 { get; set; } 
} 

並不需要所有的屬性。記錄的數量取決於用戶將要保存的選擇(例如,這是一個CarEntity - 如果用戶訂購車輪,則會填充WheelSize和WheelQuantity屬性,如果用戶要求重新繪製,則會填充RepaintingColor等等) 。

假設此實體中有60個屬性,並非所有屬性都保存在ATS中。儘管定義了一個屬性並且沒有返回錯誤,但該數據並未保存在表中。我知道每個實體有1MB的限制,但考慮到我們已經完成的計算,這與1MB的限制有點相差甚遠。

任何幫助爲什麼列不顯示,即使屬性被保存相應?我的保存功能定義如下:

public static CarEntity CarInsertOrReplace(CarEntity entity)   
    { 
     if (entity == null) 
     { 
      throw new ArgumentNullException("entity"); 
     } 

     var table = SetupTable(entity.TableName); 
     table.CreateIfNotExists(); 

     TableOperation insertOrMergeOperation = TableOperation.InsertOrReplace(entity); 

     TableResult result = table.Execute(insertOrMergeOperation); 
     CarEntity objEntity = result.Result as CarEntity; 
     return objEntity; 
    } 
+0

我想我的問題是通過回答 - [link] http:// stackoverflow。COM /問題/ 11071899 /存儲的十進制數據型在-天青桌[/鏈接]。我只是沒有意識到,十進制數據類型會給我這方面的問題。感謝那些幫助! – Patrick

回答

1

聽起來像您的實體的屬性根據使用情況而異。可能發生的情況是,Azure表存儲僅爲不爲空的屬性創建列(設置了值)。所以你只會看到爲已設置的屬性創建的列。

0

聽起來好像表存儲按照您的要求執行,但不一定像您期望的那樣執行。正如@Paul Fryer所回答的那樣,ATS不會存儲空值,因爲您不會(通過您的引用代碼)初始化CarEntity屬性,所以默認情況下它們將爲空。因此只有用戶設置的屬性纔會保存到表格中。

https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx #Remarks:

如果插入或更換實體操作用於替換 實體,從以前的實體的任何屬性將如果 新實體沒有定義它們刪除。也會刪除具有空值的屬性 。

此外,從你的代碼

TableResult result = table.Execute(insertOrMergeOperation); 
CarEntity objEntity = result.Result as CarEntity; 

結果將包含TableOperation不在的情況下全部的實體,這是你期待什麼樣的副本。

此場景可能與使用(例如,未賦予字段值的數據庫的數據庫缺省值或默認值爲null)的SQL表與使用不存在未賦值的字段的Azure表模型之間的差異。您只需在讀取/寫入所選存儲時注意其差異。

如果您需要將所有字段持久保存到表中,請爲每個屬性提供一個默認值,例如, string.Empty

0

如果字符串爲空或空,那麼它根本不保存屬性。你沒有做錯任何事情,當你與他們合作時,你必須在設計中考慮這一點。

如果您使用TableEntity,那麼它會爲您執行空/空檢查。如果你使用DynamicTableEntity,那麼你必須自己檢查一下。

相關問題