gpt4 book ai didi

azure-table-storage - 使用 Array 或 List 属性创建 TableEntity?

转载 作者:行者123 更新时间:2023-12-04 13:22:06 24 4
gpt4 key购买 nike

我在 Azure 表中存储了一些这样的枚举

pk   rk |    en     fr     de   ...

foo 1 | 'Eune' 'Fune' 'Dune' ...
foo 2 | 'Edoe' 'Fdoe' 'Ddoe' ...

bar 1 | 'Unee' 'Unef' 'Trid' ...
bar 2 | 'Diee' 'Dief' 'Died' ...
bar 3 | 'Trie' 'Tref' 'Trid' ...
en , fr , de等等...是语言代码,分别是表中的列名。

什么样的 TableEntity我应该创建以正确加载它吗
public class FooEntity : TableEntity
{
public Dictionary<string, string> Descriptions {get; set} // ?
}

然后像 myFoo["fr"] 一样使用它们... 是否可以?

假设我有英文 GUI,我需要显示 Foo选择 Eune/ Edoe作为选择值。

最佳答案

我的回答扩展了兆星将复杂实体属性写入 JSON 并将其持久化到 Azure CosmosDB 的方法。

但是,setter 中字符串和对象之间的序列化会导致以下问题:

  • 例如,如果您要在字典 DicProperty 中添加或删除一个项目,则不会调用其 setter ,因为您尚未修改字典但已修改其内容。同样,在您对序列化自定义对象或类感兴趣的更复杂的用例中,修改类的成员不会触发 setter。当实体提交到 CloudTable 时,这可能会导致数据丢失。
  • 如果您确实选择在您的复杂属性上实现类似 INotifyPropertyChanged 的​​东西,无论是通过使用某种形式的 ObservableCollection 还是自己进行事件通知工作,您最终都会序列化和反序列化太多次。这也是整个模型中的代码太多而无用。

  • 相反,我重写了 TableEntity 的 WriteEntity 和 ReadEntity 方法来编写自定义序列化和反序列化代码,这些代码仅在从 CloudTable 检索实体或提交给它时调用——因此每次检索、更新操作等只调用一次。

    代码如下。我已经说明了一个更复杂的示例,其中我的 TableEntity 包含一个类,而该类又包含一个字典。
    public class MeetingLayoutEntity : TableEntity
    {
    /// <summary>
    /// Extends TableEntity, the base class for entries in Azure CosmosDB Table tables.
    /// </summary>
    public MeetingLayoutEntity() { }

    public MeetingLayoutEntity(MeetingLayout layout, string partition, string meetingId)
    {
    this.Layout = layout;
    this.PartitionKey = partition;
    this.RowKey = meetingId;
    }

    // Complex object which will be serialized/persisted as a JSON.
    [IgnoreProperty]
    public MeetingLayout Layout { get; set; }

    public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
    {
    // This line will write partition key and row key, but not Layout since it has the IgnoreProperty attribute
    var x = base.WriteEntity(operationContext);

    // Writing x manually as a serialized string.
    x[nameof(this.Layout)] = new EntityProperty(JsonConvert.SerializeObject(this.Layout));
    return x;
    }

    public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
    {
    base.ReadEntity(properties, operationContext);
    if (properties.ContainsKey(nameof(this.Layout)))
    {
    this.Layout = JsonConvert.DeserializeObject<MeetingLayout>(properties[nameof(this.Layout)].StringValue);
    }
    }

    }

    了解更多 ReadEntityWriteEntity .

    关于azure-table-storage - 使用 Array 或 List 属性创建 TableEntity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517481/

    24 4 0