TableServiceContext не будет сериализовать ValueObjects - PullRequest
2 голосов
/ 01 марта 2012

У меня есть следующая структура данных:

[DataServiceEntity]
public class User
{
    public string RowKey { get; set; }
    public string PartitionKey { get; set; }
    public DateTime Timestamp { get; set; }

    public AddressValueObject Address { get; set; }
}

[DataServiceEntity]
public class AddressValueObject
{
    public string City { get; set; }
    public string Street { get; set; }
}

Теперь я создаю новый экземпляр класса User и пытаюсь сохранить его в эмуляторе хранения таблиц Windows Azure, используя следующий метод:

void CreateAndSaveNewUser()
{
    var userInstance = new User
    {
        RowKey = "SomeRowKey",
        PartitionKey = "SomePartitionKey",
        Address = new AddressValueObject
        {
            City = "SomeCity",
            Street = "SomeStreet"
        }
     };

     var tableServiceContext = CloudStorageAccount
                               .DevelopmentStorageAccount
                               .CreateCloudTableClient()
                               .GetDataServiceContext();

     tableServiceContext.AddObject("UserTable", userInstance);

     tableServiceContext.SaveChanges();
}

Проблема теперь в том, что AddressValueObject неправильно сериализован. В хранилище есть только один столбец с именем AddressValueObject, который является emtpy.

Не созданы столбцы для AddressValueObject_City и AddressValueObject_Street.

Что я делаю не так? Я пропускаю какой-то атрибут?

Поддерживает ли хранилище таблиц Azure ссылочные объекты ValueObjects?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Просто вы не можете этого сделать.Хранилище таблиц представляет собой простую простую таблицу и не поддерживает сложные типы.Следовательно, отношения или ограничения не поддерживаются.В качестве обходного пути вы можете подумать о сохранении ключа раздела и ключа строки связанного объекта, хранящегося в другой таблице.Если вы хотите использовать отношения, то лучшим выбором будет SQL Azure.

2 голосов
/ 01 марта 2012

Фабио Коззолино прав.Клиент хранения таблиц Microsoft Azure не поддерживает сериализацию.Однако вы можете вручную сериализовать ваш объект и сохранить его в виде XML-строки или байта [].

Я написал клиент, который поддерживает сериализацию из коробки.Я также включаю в себя множество других функций, таких как массивы, перечисления и данные размером более 64K.Вы можете проверить это на www.lucifure.com или скачать Lucifure Stash через NuGet.

0 голосов
/ 17 апреля 2016

Я написал API-интерфейс ObjectFlattenerRecomposer в Nuget, который позволяет записывать и читать сложные объекты в / из хранилища таблиц Azure.

Пакет Nuget: https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Блог: https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

API предоставляет функциональные возможности для преобразования сложных объектов в словарь EntityProperty и функциональные возможности для составления исходного сложного объекта из сведенного объекта.словарь свойств.Одно из применений заключается в том, что API позволяет записывать любой сложный объект с вложенными свойствами в хранилище таблиц Azure в плоской форме, что обычно невозможно с помощью SDK клиента хранилища Azure.

API также позволяет сохранять Enum, TimeSpan, DateTimeOffset, Nullable типы типов в хранилище таблиц Azure, что также невозможно с помощью SDK клиента хранилища Azure.

Использование:

с использованием ObjectFlattenerRecomposer;

// Свести объект и преобразоватьэто к словарю EntityProperty

Словарь flatlinedProperties = EntityPropertyConverter.Flatten (complexObject);

// Создать DynamicTableEntity и установить его PK и RK

DynamicTableEntity dynamicTableEntity = new DynamicTableKity, rowKey);

dynamicTableEntity.Properties = flatenedProperties;

// Записать DynamicTableEntity в хранилище таблиц Azure с помощью клиентского SDK

// Считать объект обратно из AzureTableStorage как DynamicTableEntityнасиспользуя те же PK и RK

сущность DynamicTableEntity = [Чтение из Azure с использованием PK и RK];

// Преобразование DynamicTableEntity обратно в исходный сложный объект.

Представьте себеисходный complexObject был типа Order.

Order order = EntityPropertyConverter.ConvertBack (entity.Properties);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...