我想分享一下我是如何解决这个问题的,因为使用DynamicTableEntity 并不清楚;至少我很容易找到。如果有其他建议,我很乐意取消标记此答案。
选项 1:串联
根据您的要求,如果串联结果超过 64KB 限制,这将是一个糟糕的选择。我确定还有其他方法,但是以下方法是对我有用的一种选择。首先,我更改了模型以反映字符串而不是字符串列表:
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:表设计修改
我最终选择了第二条路线,因为通过引用原始对象上的 ID 来存储和重新水化对象更容易。我必须修改 UserModel 以删除对组的任何引用,然后我需要为其添加一个唯一 ID,如下所示:
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));
});
}
最后,我写了一个简单的方法来从 Groups 表中读取整个 Groups 分区。