2015-10-06 94 views
-1

在表實體模型的最例子我看到的是這樣的:Azure Table中的實體模型設計

public class CustomerEntity : TableEntity 
{ 
    public CustomerEntity(string lastName, string firstName) 
    { 
     this.PartitionKey = lastName; 
     this.RowKey = firstName; 
    } 

    public CustomerEntity() { } 

    public string Email { get; set; } 

    public string PhoneNumber { get; set; } 
} 

我們在這裏看到lastname,並作爲相應的分區鍵和行鍵firstname。因此,在保存和檢索實體後,我可以從PartitionKeyRowKey屬性中訪問這些信息。但是,如果我想稍後將此模型作爲json發送到客戶端,那麼我認爲TableEntity基類的PartitionKeyRowKey不會被序列化。因此,如果我添加LastNameFirstName作爲屬性進行建模,則存儲中將發生不必要的數據重複。最好的方式是避免存儲中的數據重複,同時在模型序列化後可以訪問姓氏和名字。

+0

爲什麼你認爲'PartitionKey'和'RowKey'不會被序列化? –

+0

我記得我們使用[DataMember]屬性來控制是否序列化模型屬性,它似乎在web api中是不必要的... – igorGIS

+0

您可能已經考慮過這一點,但通過此設計,您只能擁有一個客戶一樣的名字。例如,如果您有兩個名爲「Chris Williams」的客戶,則由於PartitionKey和RowKey的組合必須是唯一的,因此這將失敗。 – ChrisW

回答

2

您可以隨時使用getter方法上你的類,以避免混淆:

public class CustomerEntity : TableEntity 
{ 
    public CustomerEntity(string lastName, string firstName) 
    { 
     this.PartitionKey = lastName; 
     this.RowKey = firstName; 
    } 

    public CustomerEntity() { } 

    public string Email { get; set; } 

    public string PhoneNumber { get; set; } 

    public string FirstName { get { return this.RowKey; } } 

    public string LastName { get { return this.PartitionKey; } } 

} 

或者,您也可以將數據映射到API中的一個匿名對象並返回通過JSON:

var customerJson = new 
{ 
    Firstname = customer.RowKey, 
    LastName = customer. PartitionKey, 
    customer.Email, 
    customer.PhoneNumber 
}; 
return JsonConvert.SerializeObject(customerJson); 
+0

謝謝。但是數據會被複制嗎?我的意思是存儲表中FirstName和LastName的列將使用與PartitionKey和RowKey相同的值創建? – igorGIS

+0

對於應該存儲在Table服務中的任何屬性,該屬性必須是公開的受支持類型的公有屬性,這些屬性公開get和set。另外,你的實體類型必須公開一個無參數的構造函數。找出最簡單的方法就是試試看。查看映射選項的更新答案。 – viperguynaz