gpt4 book ai didi

c# - Azure表存储: "Parameter count mismatch" storing array/list/IEnumerable

转载 作者:行者123 更新时间:2023-12-03 01:03:20 25 4
gpt4 key购买 nike

我正在尝试编写一个包含集合的简单对象,例如:

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

使用 DynamicTableEntityFlatten方法,我在提交实体之前通过传递 UserModel 设置属性对象为userModel如下:

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

这不可避免地会返回上述错误:

Parameter count mismatch

据我所知,这是由于 here 中描述的“展平”方法造成的。我尝试设置我的 GroupIDs对象数组、列表和 IEnumerable 没有运气(同样的问题)。

是否有人建议在 Azure 表存储中对此类对象使用 flatten 方法来提交带有字符串集合的对象?

最佳答案

我想分享一下我是如何解决这个问题的,因为使用DynamicTableEntity还不太清楚;至少我可以轻松找到。如果还有其他建议,我很乐意取消标记此答案。

选项 1:串联

根据您的要求,如果串联结果超出 64KB 限制,这将是一个糟糕的选择。我确信还有其他方法,但是以下方法是对我有用的一种选择。首先,我更改了模型以反射(reflect)字符串而不是字符串列表:

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 的整个分区。

关于c# - Azure表存储: "Parameter count mismatch" storing array/list/IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com