2015-10-06 3 views
-1

В большинстве примеров моделей таблицы сущностей я вижу что-то вроде:Azure дизайн табличная модель сущность

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 используется в качестве ключа секционирования и ключа строки соответственно. Поэтому после сохранения и получения объекта я могу получить доступ к этой информации от PartitionKey и RowKey. Но что, если я хочу отправить эту модель на клиентскую сторону позже как json, я полагаю, что PartitionKey и RowKey базового класса TableEntity не будут сериализованы. Поэтому, если я добавлю LastName и FirstName в качестве свойств модели, то при хранении будет происходить ненужное дублирование данных. Лучший способ избежать дублирования данных в хранилище и в то же время иметь доступ к имени и имени после сериализации модели.

+0

Почему вы думаете, что 'PartitionKey' и' RowKey' не будут сериализованы? –

+0

Я помню, что мы используем атрибут [DataMember], чтобы определить, следует ли сериализовать свойство модели, что в веб-api не нужно ... – igorGIS

+0

Возможно, вы уже это рассмотрели, но с этим дизайном вы можете иметь только одного клиента с то же имя. Если у вас есть два клиента с общим именем «Крис Уильямс», например, это не сработает, поскольку комбинация PartitionKey и RowKey должна быть уникальной. – ChrisW

ответ

2

Вы всегда можете использовать метод получения вашего класса, чтобы избежать путаницы:

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

Спасибо. Но будут ли данные дублироваться? i означает, что столбцы в таблице хранения для FirstName и LastName будут созданы с теми же значениями, что и PartitionKey и RowKey? – igorGIS

+0

Для любого свойства, которое должно храниться в службе таблицы, свойство должно быть общедоступным для поддерживаемого типа, который предоставляет и get, и set. Кроме того, ваш тип сущности должен выставлять конструктор без параметров. Самый простой способ узнать это - попробовать. См. Обновленный ответ для опции сопоставления. – viperguynaz

Смежные вопросы