Хранилище таблиц Azure: массив «Несоответствие параметров» хранит массив / список / IEnumerable - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь написать простой объект, содержащий коллекцию, например:

public class UserModel
{
    public string FirstName { get; set; }
    public List<string> GroupIDs { get; set; }
}

Используя метод DynamicTableEntity и Flatten, я устанавливаю свойства перед фиксацией объектапередавая объект UserModel как userModel следующим образом:

var entity = new DynamicTableEntity(partitionKey, rowKey);
entity.Properties = TableEntity.Flatten(userModel, new OperationContext());

Это неизбежно возвращает вышеупомянутую ошибку:

Несоответствие количества параметров

Из того, что я могу сказать, это происходит из-за метода "сглаживания", как описано здесь .Я попытался установить мой GroupIDs объект для массива, списка и IEnumerable без удачи (та же проблема).

У кого-нибудь есть рекомендации по отправке этого объекта с набором строк с использованием метода flatten для этого типа объектов в хранилище таблиц Azure?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Я хотел бы поделиться, как я решил эту проблему, так как нет особой ясности в использовании DynamicTableEntity;по крайней мере, что я мог легко найти.Если есть другие предложения, я с радостью сниму отметку с этого ответа.

Вариант 1: Конкатенация

В зависимости от ваших требований, это будет плохим вариантом, если результаты конкатенации превысятОграничение 64 КБ.Я уверен, что есть и другие, однако следующий метод был одним из вариантов, который работал для меня.Во-первых, я изменил модель для отображения строки вместо списка строк:

public List<string> GroupIDs { get; set; } //instead of this

public string GroupIDs { get; set; } //to this

Я преобразовал свой список следующим образом:

var groupList = new List<string>{ "123", "456", "789" };
var userObject = new UserModel(
{
    FirstName = "Jason";
    GroupIDs = string.Join(",", groupList);
});

Теперь свойство userObject.GroupIDs являетсяи может быть написано так, как я показал в исходном сообщении.

Вариант 2: Модификация таблицы

В итоге я пошел по этому второму маршруту, так как его было проще хранить и повторно гидрироватьобъект путем ссылки на идентификатор исходного объекта.Мне пришлось изменить UserModel, чтобы удалить любую ссылку на группы, затем мне нужно было добавить уникальный идентификатор к нему следующим образом:

public class UserModel
{
    public string FirstName { get; set; }
    public string UserId { get; set; }
}

Я создал таблицу только для групп, на которые ссылаютсяоригинальный стол.Я начал с создания GroupModel объекта для хранения UserId, на который мне нужно сослаться:

public class GroupModel
{
    public string UserId { get; set; }
    public string GroupId { get; set; }
    public string GroupName { get; set; }
}

Затем я написал новый метод для обработки каждого объекта в отдельности следующим образом:

public Interface ITableOps
{
    Task WriteNewUser(UserModel user, List<GroupModel> groups);
}

public class TableOps : ITableOps
{
    public async Task WriteNewUser(UserModel user, List<GroupModel>, groups)
    {
        //...assume user table connection is created

        var entity = new DynamicTableEntity(partitionKey, rowKey);
        entity.Properties = TableEntity.Flatten(user, new OperationContext());
        await userTable.ExecuteAsync(TableOperation.Insert(user));

        //...assume group table connection is created

        groups.ForEach(async g =>
            {
                var groupsEntity = new DynamicTableEntity(user.UserId, Guid.NewGuid().ToString());
                groupsEntity.Properties = TableEntity.Flatten(g, new OperationContext());
                await groupsTable.ExecuteAsync(TableOperation.Insert(groupsEntity));
            });
    }

Наконец, я написал простой метод для чтения всего раздела групп из таблицы групп.

0 голосов
/ 06 мая 2019

Да TableEntity.Flatten в SDK не поддерживает свойства типа ICollection/IEnumerable.Но v2.0 API ObjectFlattener здесь поддерживает свойства IEnumerable / ICollection и т. Д.https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Я привел пример использования в описании пакета Nuget, он очень похож на использование TableEntity.Flatten/ConvertBack api, но с поддержкой всех типов свойств.

...