Я хотел бы поделиться, как я решил эту проблему, так как нет особой ясности в использовании 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));
});
}
Наконец, я написал простой метод для чтения всего раздела групп из таблицы групп.